属性驱动模式:
params拦截器赋值
Action中的属性要和表单元素name属性相同。
<form action="login111.action">
用户名<input type="text" name="username"/><br/>
密码<input type="text" name="password"/><br/>
<input type="submit" value="提交"/>
</form>
private String username;
private String password;
模型驱动模式ModelDriven:
ModelDriven拦截器实现。
继承关系:ModelDrivenInterceptor—>>>AbstractInterceptor—>>>Interceptor
1.Action实现ModelDriven<T>,并实现接口中的getModel方法。
2.在Action中实例化一个User,并且通过getModel()返回。
<form action="login111.action">
用户名<input type="text" name="username"/><br/>
密码<input type="text" name="password"/><br/>
<input type="submit" value="提交"/>
</form>
推荐使用:
1.在Action中声明一个用户,并生成get,set方法
private User user;
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
2.修改表单元素的名字,使用user.属性
用户名<input type="text" name="user.username"/><br/>
密码<input type="text" name="user.password"/><br/>
在struts2中result的name属性默认为success
<result>/login_success.jsp</result>
<result name="success">/login_success.jsp</result>
实现com.opensymphony.xwork2.Action接口的好处:
可以使用Action中的定义好的常量,并且必须实现execute方法
struts2配置信息:
struts.configuration.xml.reload=false:struts2的xml文件在更新之后是否重新加载的配置.
struts.devMode = false:struts开发者模式,错误页面相对友好。
修改方式1(属性文件修改):
1.在classpath下新建struts.properties属性文件.
2.属性文件中写入struts.configuration.xml.reload=true
修改方式2(xml文件修改):
在struts2.xml中进行修改
<constant name="struts.configuration.xml.reload" value="true"/>
修改方式3(web.xml文件修改):
<init-param>
<param-name>struts.configuration.xml.reload</param-name>
<param-value>true</param-value>
</init-param>
struts2支持配置文件模块化:
<include file="struts-user.xml"/>
在struts2中操作Servlet API:(包括HttpServletRequest,HttpServletResponse,HttpSession)
1.通过ActionContext获取.(***没有侵入性是指没有侵入servletAPI)
a.获取session(不是httpSession)Map map = ActionContext.getContext().getSession().put("userLogined", user);
b.获取request ActionContext.getContext().put("userLoginedRequest", user);
c.获取application
d.直接获取表单元素String username = (String) ActionContext.getContext().getParameters().get("username");
2.通过ServletActionContext(具有侵入性)
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
3.通过实现接口获取request,response
a.获取request
private HttpServletRequest request;
实现org.apache.struts2.interceptor.ServletRequestAware
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
b.获取response
实现org.apache.struts2.interceptor.ServletResponseAware
private HttpServletResponse response;
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
c.获取ServletContext
实现org.apache.struts2.util.ServletContextAware
private ServletContext context;
public void setServletContext(ServletContext context) {
this.context = context;
}
struts2的命名空间namespace:
struts2默认命名空间为 namespace="/"
struts2资源的访问路径 项目名(/)+namespace+action:struts2_1125/user/sdfsdf/sdfsdf/add.action
struts2命名空间查找会一层层的逐级查找知道找到根目录下(/)为止
struts2全局的result
<global-results>
<result>/add_success.jsp</result>
<result name="error">/login_error.jsp</result>
</global-results>
struts2中其他方法的调用:
1.通过修改action标签中的method属性实现
<action name="delItem" class="com.neu.action.ItemAction" method="delItem">
注意:在Action中定义的其他方法,也需要个execute方法一样,有一个String类型的返回值。throws Exception
**并且一定不要有参数。
也可以使用缺省适配器模式继承ActionSupport类,但注意ActionSupport的execute方法只能成功。
2.通过动态方法调用实现(基于约定的)
a.允许struts2使用动态方法调用配置
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
b.修改struts2配置文件
<action name="itemAction" class="com.neu.action.ItemAction">
<result>/add_success.jsp</result>
</action>
c.表单的提交位置 Action名称!方法名.action
<form action="item/itemAction!addItem.action">
好处:减少action的配置量,坏处:url地址过于复杂。
3.使用通配符调用方法注意基于约定
1.<action name="*Item" class="com.neu.action.ItemDyAction" method="{1}">
<result>/{1}_success.jsp</result>
</action>
2.<form action="item/addItem.action">
3.Action类中的方法需要命名为add
struts2上传:
1.上传必须的jar包两个:commons-fileupload-1.3.1.jar,commons-io-2.2.jar
2.在页面中写入表单文件域
<form method="POST" enctype="multipart/form-data">
<input type="file" name="myFile"/>
<input type="submit" value="上传"/>
</form>
struts2类型转换器:
1.局部类型转换器
a.新建一个转换器类并继承StrutsTypeConverter,实现其中两个方法
convertFromString() 将String转换成其他格式
convertToString 将其他格式转换成String
b.在需要应用的action同路径下建立属性文件 注意:属性文件命名必须为:XXXAction-conversion.properties
eg:QueryEmpAction-conversion.properties
c.在属性文件中写入
beginDate=com.neu.convertor.UtilDateConvertor
2.全局类型转换器
a.新建一个转换器类并继承StrutsTypeConverter,实现其中两个方法
convertFromString() 将String转换成其他格式
convertToString 将其他格式转换成String。注意:需要配合strtus2标签一起使用才能生效
b.需要在src classpath下新建属性文件
文件名称命名为:xwork-conversion.properties
c.java.util.Date=com.neu.convertor.UtilDateConvertor
如果全局和局部同时存在,就近原则以局部为准。
strtus2的标签使用(对应jstl标准标签库):
1.通过taglib指令引入标签库<%@taglib uri="/struts-tags" prefix="s"%>
标签库定义的位置:struts2-core-2.3.29.jar/META-INF/struts-tags.tld
2.通过<s:使用
struts2中的异常处理:
1.局部异常处理(action中)
<action name="login" class="com.neu.action.LoginAction" method="login">
<exception-mapping result="error" exception="com.neu.exception.UserNotFoundException"></exception-mapping>
<result>/login_success.jsp</result>
<result name="error">/login_error.jsp</result>
</action>
2.全局异常处理:
<global-results>
<result name="error">/login_error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="com.neu.exception.UserNotFoundException"></exception-mapping>
</global-exception-mappings>
struts2自定义拦截器:
1.创建拦截器类MyInterceptor使其继承自拦截器类AbstractInterceptor体现缺省适配器模式
也可以直接实现Interceptor接口。
2.在struts2.xml中使用interceptor标签配置。
a. <!-- 将拦截器先声明 -->
<interceptors>
<interceptor name="my" class="com.neu.interceptor.MyInterceptor"/>
</interceptors>
b. 将声明好的拦截器应用到Action上去
<action name="login" class="com.neu.action.LoginAction" method="login">
<interceptor-ref name="my"/>
</action>
注意:会覆盖之前的拦截器
加入<interceptor-ref name="defaultStack"/>
引入默认拦截器栈中的拦截器。
配置struts2的默认拦截器栈:
1. <interceptors>
<interceptor name="my" class="com.neu.interceptor.MyInterceptor"/>
</interceptors>
2.配置自定义拦截器mymydefaultStackdefaultStackmyInterceptorStackzha
3.使自定义拦截器生效: <default-interceptor-ref name="自定义拦截器名称"/>
默认的拦截器栈(一堆拦截器):
***struts2的Action为多例
***servlet为单例的
MethodFilterInterceptor:
使用:当前action需要拦截特定的方法或者放行特定的方法时使用。
excludeMethods 哪些方法放行
includeMethods 拦截哪些方法