struts2 学习笔记(一)

来源:互联网 发布:java 解压缩zip文件 编辑:程序博客网 时间:2024/06/05 19:17

比较零碎:

struts2读取到struts.xml的内容后,以javabean形式存放在内存中,
以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取
struts.xml文件


StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认
的配置文件struts.xml完成初始化操作。


包可以通过abstract="true"定义为抽象包,抽象包中不能包含action


http://localhost:8080/struts2_001/control/center/sdfs/hello
上边这样的路径也可以搜索到


如果/control/center/sdfs/的包目录不存在,则跑到上级目录
找到:/control/center/,一级级往上找


如果包package下不存在action,包存在
寻找namespace为/的package,如果存在这个package,如果找不到action,就去
他会在默认namespace=“” 或者不设置namespace,在另一个包中(namespace="")寻找,如果
能找到action


1.如果没有为action指定class,默认为ActionSupport
2.如果没有为action指定method,默认执行action中的execute方法
3.如果没有指定result的name,默认为SUCCESS


result type 
default:dipatcher服务器内部转发


<action name="redirect">
<!--不能是web-inf下的文件 -->
<result type="redirect">/employeeAddUI.jsp</result>
</action>


struts1:
<action path="">
<forward name="add">/index.jsp</forward>
<forward name="add redirect="true">/index.jsp</forward>
</action>

服务器端 使用ISO8859-1编码


redirectAction,重定向到action
 <action name="redirectAction">
  <result type="redirectAction">list</result>
 </action>
 
plainText:显示jsp源代码文件
struts指定读取文件:默认系统字符集GBK


公用视图:
<!-- 包继承,全局视图 -->
<package name="base" extends="struts-default">
 <global-results>
      <result name="message">
      /WEB-INF/pages/message.jsp
      </result>
      </global-results>
</package>
常量定义加载顺序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml


后一个覆盖前一个的常量值


指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker,velocity的输出
<constant name="struts.i18n.encoding" value="UTF-8"/>


设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache" value="false"/>


当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用)
<constant name="struts.configuration.xml.reload" value="true"/>


开发模式下使用,这样可以打印详细的错误信息
<constant name="struts.devMode" value="false" />


默认的视图主题:
<constant name="struts.ui.theme" value="simple"/>


与spring集成时,指定有spring负责action对象的创建:
<constant name="struts.objectFactory" value="spring"/>


struts2是否支持动态方法调用,默认值是true
<constant name="struts.enable.DynamicMethodInvocation" value="false" />


上传文件的大小限制:
<constant name="struts.multipart.maxSize" value="10701096"/>




struts2的处理流程:
用户请求--------->StrutsPrepareAndExecuteFilter 检测路径后缀(没有或者action...),否则不处理
-------->Interceptor
-------->Action
-------->Result
-------->Jsp/html
响应 <---------

与struts1不同,每一次请求struts2都会创建一个新的action,线程安全
struts1,创建出action后,会放进缓存中,单例模式,就一个


一个模块,一个配置文件,最后include进来。struts.xml只配置一下公用的内容
<struts>
<include file="employee.xml"/>
</struts>


动态方法调用和使用通配符定义:
struts1: action继承DispatchAction
<action path="/control/center" type="...DispatchAction" parameter="method"/>
</action>
/control/center?method=addUI


struts2动态方法调用:1.action名称!method 2.1以后不推荐使用了
2.使用通配符,推荐。*号 , 占位符 {1}


struts2.1.6 bug 请求参数乱码
利用filter request.setCharacter("UTF-8"); doFilter()


struts2有两种类型转换器:
局部 对某个action
在action类所在的包下放置ActionClassName-conversion.properties
全局
WEB-INF/classes下放置xwork-conversion.properties文件。
java.util.Date=com.ethan.converter.DateTypeConverter


获取httpServletRequest....
1.ServletActionContext.getRequest().
  request.getSession();
  .....................getServletContext();
  .....................getResponse();
  
2.实现接口,自动注入 反射 set
implements ServletRequestAware,ServletResponseAware,ServletContextAware
private HttpServletRequest request;
private ServletContext servletContext;
private HttpServletResponse response;


struts2自动注入
public void setServletRequest(HttpServletRequest req) {
this.request = req;
}
jstl标签使用:jstl.jar standard.jar


文件上传:
action中的File 属性名 一定要和表单中的file字段名一样


多文件上传:数组或者List


对所有方法校验:
1.手工编写代码校验;
@Override
public void validate() {
// TODO Auto-generated method stub
if(this.username==null||"".equals(this.username.trim())) {
ActionContext.getContext().put("username", username);
this.addFieldError("username", "用户名不能为空");
}
if(this.mobile==null||"".equals(this.mobile.trim())) {
ActionContext.getContext().put("mobile", mobile);
this.addFieldError("mobile", "电话号码不能为空");
} else {
if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile).matches()) {
ActionContext.getContext().put("mobile", mobile);
this.addFieldError("mobile", "手机号码格式不正确");
}
}

}
对指定方法:validate+方法名
@Override
public void validateUpdate() {
2.xml配置




输入校验的流程:
1.类型转换器对请求参数执行类型转换,赋给action中的属性
2.如果转换过程中出现异常,拦截器将异常信息封装到fieldErrors里,进入第三步
3.系统通过反射技术先 调用action中的validateXXX()方法
4.在调用action中的validate()方法
5.如果fieldErrors.size > 0 ,系统自动转发到input视图,<s:fielderror/>/>


required 必填校验器
requiredstring 必填字符串
strlength 字符串长度校验器 minLength maxLength
regex expression caseSensitive


int  min max
double 
fieldexpression ognl表达式校验器
email
url
date
conversion
visitor
expression ognl表达式校验器


<![CDATA[...]]>不转义


xml配置方式 对指定方法 manage_save--->action name
PersonAction-manage_save-validation.xml


校验文件搜索顺序:
1.ActionClassName-validation.xml
2.ActionClassName-ActionName-validation.xml
如果规则冲突,使用后面的


如果action继承了父类action,则先搜索父类的校验规则,然后它自己,最后汇总

原创粉丝点击