使用struts2的步骤:
1.导入jar文件2.在web.xml中加入一个配置filter。拦截全部的请求/*, StrutsPrepareAndExecuteFilter
3.在src下加入一个struts.xml, package-action-result
4.假设要实现控制,须要加入action类
4.1.实现Action接口
4.2.继承ActionSupport类
4.3.直接创建类。可是必须有方法String execute()
5.改动struts.xml中的action标签,加入属性class相应该action类
struts.xml中定义常量
<constant name="" value=""/>开发模式:struts.devMode = true/false
默认编码:struts.i18n.encoding = UTF-8(默认)
怎样绑定表单元素的值:
1.使用属性:在action中加入一个同名属性。并提供get/set方法2.使用javabean:在aciton中加入一个对象,并提供get/set方法
表单元素的名字。应该为对象名.属性名
3.使用ModelDriven
怎样在一个Action类中处理多个请求
1.在该Action类中,每一个请求填加一个方法2.在struts.xml中,加入对应的配置:
2.1.第一种:在action标签中加入属性method,指定方法
2.2.另外一种:每一个模块。单独写一个配置文件,在struts.xml中include进来
2.3.第三种:动态方法:提交时,url后面加上"!方法名",比如"house!add"
2.4.第四种:通配符:
<action name="house_*" class="com.HouseAction" method="{1}">
默认action:
<default-action-ref name="index"/><action name="index"><result>/index.jsp</result></action>
<result>的属性:
1.name,默认值是success。相应方法运行的返回结果
2.type,默认值是dispatcher,指跳转方式
dispatcher: 转发到jsp
redirect: 重定向到本地或其它jsp或者action
redirectAction: 重定向到本地action
chain: 转发到action
动态结果:
1.在action中加入一个String属性,记录目标url2.在方法中动态给该属性赋值
3.在struts.xml中,该action标签的result的url使用${属性名}
问题:url反复的问题
<form action="user/login">public String login(){
return INPUT;
}
<result name="input">/login.jsp</result>
当提交表单失败的时候,因为result默认type是转发,所以url地址不会变;
下次再提交时。会导致/user反复出现。
解决的方法:
1.提交表单的action使用绝对路径,前面加一个request.getContextPath()
2.result中的type改成重定向
设置全局结果和全局异常:
<package name="base" extends="struts-default" namespace="/">
<global-results>
<result name="error">error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>
</global-exception-mappings>
</package>
怎样获得struts2封装的请求,会话,应用
ActionContext ctx = ActionContext.getContext();Map<String,Object> request = (Map<String,Object>)ctx.get("request");
Map<String,Object> session = ctx.getSession();
Map<String,Object> application= ctx.getApplication();
通过实现RequestAware,SessionAware,ApplicationAware接口,也能够获得
怎样在JSP中获取请求,会话,应用中的值:
1.通过jsp内置对象2.通过el表达式
3.stuts标签:<s:property value="[#request.key][#attr.key]"/>
获得原生的Servlet API对象的方式一:
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
获得原生的Servlet API对象的方式二:
通过实现接口ServletRequestAware,ServletContextAware。也能够获得
JSTL:
<c:if test=""></c:if><c:forEach items="" var=""></c:forEach>
<c:out value=""></c:out>
<c:set var="" value=""></c:set>
<c:remove var=""></c:remove>
OGNL知识点
OGNL訪问Value Stack(值栈):对象名.属性名action中定义的属性
OGNL訪问Stack Context(值栈上下文):#作用域.属性名
作用域
OGNL訪问List: list[0], list.get(0)
OGNL訪问Map: map['key'], map.key,
取出全部key: map.keys
取出全部值: map.values
OGNL訪问Set: set.toArray()[0]
OGNL调用静态方法和属性:
@类的全然限定名@静态方法名
@类的全然限定名@静态属性名
struts.xml加入常量配置:
struts.ognl.allowStaticMethodAccess = true
1.struts自带的jar包:
antlr-2.7.6.jar和anltr-2.7.2.jar
2.Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1 和 commons-collections-3.2
commons-logging-1.0.4 和 commons-logging-api-1.1
找到重名的jar包,删掉低版本号的
Struts2标签:
数据标签:1.<s:property value="OGNL表达式" default="" escapeHTML="" />
2.<s:debug/>
3.<s:date name="OGNL表达式" format="yyyy-MM-dd HH:mm:ss"/>
4.<s:set var="变量名" value="OGNL表达式" scope="作用域,默认是action"/>--- OGNL路径过长,或反复使用某个方法的运行结果
5.<s:url value="地址" var="t"/>有var属性当前字符串不显示
6.<s:a href="字符串"></s:a>,假设href里面想填入OGNL,则须要把字符串转换成OGNL表达式,%{#t}
7.<s:include value="要包括的jsp"/> 动态的包括
须要进行转换的:
1.字符串转换成OGNL:-->%{}该属性默认是字符串:s:a-href,s:url-value, s:include-value
2.OGNL转换成字符串:
该属性默认是OGNL:--->用引號引起来
s:property-value,
s:property-default,
s:date-name
s:param-value
假如不确定该属性是否默觉得OGNL,能够使用%{},来保证作为OGNL表达式处理
控制标签:
1.<s:if test="OGNL表达式"></s:if>
2.<s:else><s:elseif>
3.<s:iterator var="当前元素" value="集合" status="集合状态">
取当前元素的属性:<s:property value="#当前元素.属性名"/>
推断当前索引是否奇数:<s:if test="#集合状态.odd"></s:if>
推断当前索引是否偶数:<s:if test="#集合状态.even"></s:if>
</s:iterator>
使用jQuery实现隔行变色
$(function(){
$("table tr:gt(0):even").css("background","yellow");
});
UI标签:
<s:form theme="主题" action="" method=""></s:form>
<s:textfield name="" value=""/>
<s:textarea name="" value=""/>
<s:submit/>
<s:select name="" list="OGNL表达式" listKey="作为value的属性" listValue="作为显示文字的属性"/>
<s:doubleselect
name="" list="OGNL表达式1" listKey="作为value的属性" listValue="作为显示文字的属性"
doubleName="" doubleList="OGNL表达式2" doubleListKey="作为value的属性" doubleListValue="作为显示文字的属性"/>
注:OGNL表达式2应该是依据OGNL表达式1取出的集合。比如map.get(top)
日历控件:<s:datetimepicker name=""/>
引入步骤:1.导入struts-dojo-xxx.jar
2.在jsp上引入该taglib:
<%@taglib uri="/struts-dojo-tags" prefix="sx"%>
3.在head中加入标签。标志要引入相关css和js文件
<sx:head parseContent="true"/>
4.使用该日历控件
使用拦截器
使用拦截器的步骤1.新增一个拦截器类,继承AbstractInterceptor,在实现intercept()方法,进行拦截前后的操作。
intercept(ActionInvocation invocation){
//1.拦截前操作
//2.运行兴许
String result = invocation.invoke();
//3.拦截后操作
return result;
}
2.在struts.xml的package中,加入拦截器
<interceptors>
<interceptor name="拦截器1" class="类的全限定名"/>
<interceptor name="拦截器2" class="类的全限定名"/>
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="拦截器1"/>
<interceptor-ref name="拦截器2"/>
</interceptor-stack>
</interceptors>
3.在struts.xml的action中,指定拦截器
<interceptor-ref name="拦截器|拦截器栈"/>
假设还要使用struts默认的拦截器栈,须要再加入:
<interceptor-ref name="defaultStack"/>
表单内容: 学号、姓名、照片
Struts实现文件上传:
单个文件:1.表单中加入文件域。同一时候表单的提交方式应该是post,enctype属性应该是multipart/form-data
2.加入commons-fileupdate**.jar,commons-io**.jar
3.在action中。依据文件域的name,加入三个属性
File xxx;
String xxxContentType;
String xxxFileName;
4.在action方法中,将文件另存
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
FileOutputStream fos = new FileOutputStream(uploadPath+"/"+xxFileName);
FileInputStream fis = new FileInputStream(xxx);
IOUtils.copy(fis, fos);
限制文件上传的大小:
1.设置全局常量
<constant name="struts.multipart.maxSize" value="5000000"/>
2.加入拦截器:限制单个action的文件上传大小
<intercepter-ref name="fileUpload">
<param name="maximumSize">5000000</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
全局常量的默认值是2M。假设要限制文件大小小于2M。两种方式任选其一。
假设要限制文件大小大于2M,则所有常量必须设置为大于或等于目标大小,拦截器可选。
限制文件上传的类型:
给fileUpload拦截器加入參数:
<intercepter-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/pjpeg,image/png,image/gif</param>
</intercepter>
<intercepter-ref name="defaultStack"/>
假设出现错误:HTTP Status 404 - No result defined for action com.pb.web.action.UploadAction and result input
则是表示当result是input时,没有在action中定义相应的result。
file文件域,仅仅能取value。不能给value赋值