struts2总结

struts1和struts2的区别:

struts1:sun公司

(1)核心控制器:ActionServlet

(2) 需要继承Action或者DispachAction

(3)必须在web容器中配置

(4)页面信息可以封装到formBean中

(5)继承Action之后必须重写execute()方法,传递四个参数

(6)继承DispachAction之后可以自己定义方法名,也必须传递四个参数

(7)跳转方式,mapping.findForward("要跳转的页面");

struts2:webwork

(1)核心控制器:filter

(2)不需要继承Action,类中的放法自己定义返回String

(3)定义一个bean,通过get和set方法就可以获取信息,struts2自动把页面信息封装到request作用域中

(4) 跳转方式,return "配置文件中对应的页面跳转" 默认success; 创建一个struts2的一个项目:

定义一个类

导jar包(8个)

web.xml文件中配置核心控制器叫filter

struts.xml文件(如果没有配置就必须叫这个名字,如果名字错了,

找不到对应的action配置,如果没有配置路径就必须放到src下,代码根目录下)

struts.xml文件中需要的标签:

<package>标签:导包

属性:name:给包起了一个名字(随便起得,为了继承的时候用的)

namespace :命名空间,以"/"开头

extends:struts-default

<action>:找Action类

属性:name:给类随便起的一个名字,访问的路径

class:类的路径,不写的时候,默认为ActionSupport

method:类中需要访问的方法,如果不写,默认访问Action类中的execute方法

<result>:页面跳转

name:返回值,name值如果不写,默认success,action中根据这个名字去跳转,页面的地址必须以"/"开头

struts2的工作流程:

1.用户发送请求,请求交个核心控制器filter(web.xml),拦截以.action(不写就是默认的,可以不写)结尾的所有请求

2.通过struts.xml文件找到对应的action

3.action再调用业务逻辑类处理业务逻辑

4.根据给定的返回值通过struts.xml文件中的result标签中的name属性找到对应的路径(跳转页面)

校验:

1.拦截器

(1).定义一个类叫TestInterceptor实现Interceptor接口

(2).重写intercept方法在这个方法中去判断信息存不存在

public String intercept(ActionInvocation arg0) throws Exception {

System.out.println("拦截器已经进入");

String result=null;

if(1==1){//session.get 判断用户信息事是否存在

result =arg0.invoke();

}else{

result="login";

}

return result;

}

(3).在struts.xml配置文件中去配置相应的配置信息:

<interceptors>:有很多个

name:随便起的名字 class:拦截器类的路径

<interceptor name="interceportemp" class="com.starting.interceptor.TestInterceptor" />

自己定义的拦截器的堆栈,name:自己定义的名字

<interceptor-stack name="tempStack">

继承来的,已有的方法,引用已经寻在的

<interceptor-ref name="defaultStack" />

引用自己定义的name:和自己定义的拦截器的name值是一样的 <interceptor-ref name="interceportemp" />

</interceptor-stack>

</interceptors>

<action name="user_*" class="com.starting.struts2.action.UserAction" method="{1}" > <result>/WEB-INF/pages/success_{1}.jsp</result>

<interceptor-ref name="tempStack"/>:某个action类中调用拦截器就在这个action中直接调用自己定义的拦截器

</action>

2.调用validate方法

(1).定义一个Action类,继承ActionSupport

(2).重写validate方法

@Override

public void validate() {

// StringUtils.isEmpty(cs)

if (this.getUser().getUsername() == null

|| "".equals(this.getUser().getUsername().trim())) {

this.addFieldError("user.username", "用户名不能为空");

}

}

(3).如果给某个特定的方法验证:

public String execute() {

System.out.println("execute被调用" + username);

return "success";

}

//validate后加特定的方法名

public void validateExecute() {

if (this.getUser().getUsername() == null

|| "".equals(this.getUser().getUsername().trim())) {

this.addFieldError("user.username", "用户名不能为空");

}

}

(4).页面输出验证消息

导struts2标签 <%@ taglib prefix="s" uri="/struts-tags" %>

<s:fielderror/>通过这个标签去输出验证消息

(5).struts.xml配置文件中需要配置<result name="input">/index.jsp</result>

3.配置文件validate框架

(1).建一个类叫PersonAction,定义几个需要验证的属性值比如:name,mobile,get,set方法

(2).建一个xml配置文件叫PersonAction-validation.xml("-"前半部分名字必须同类名相同:为特定的某个类做验证,"-"后半部分的名字叫validation.xml:约定)

(3).在PersonAction-validation.xml配置文件中去配置相应的验证

<validators>

<field name="name">:name:对应的类中的属性名

<field-validator type="requiredstring">:验证框架自己提供的验证方法,验证是否为空

<param name="trim">true</param>:去空格,去左右空格

<message>用户名不能为空!</message>:验证消息

</field-validator>

</field>

<field-validator type="regex">

<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>:正则表达式:判断手机号

<message>手机号格式不正确!</message>

</field-validator>

</field>

</validators>

(4).页面输出

4.类型转换(String --Date之间的转换)

流程:在页面的文本框中输入一个字符串,想把这个字符串转换成Date型的

通过文本框中的name值去找到消息资源文件中对应的key值,通过这个value值找到对应的转换类

在类中进行转换,在Action类中取到转换后的值,在页面显示

(1).定义一个类叫 DataTypeChange继承DefaultTypeConverter

(2).重写convertValue方法

@Override

public Object convertValue(Map context, Object target, Member member,

String propertyName, Object value, Class toType) {

//时间的格式

SimpleDateFormat format =new SimpleDateFormat("yyyymmdd");

try {

if(toType == Date.class){//判断是否为Date类型toType:java.util.Date

String[] str=(String[])value;//类型之间的转换

return format.parse(str[0]);

}

if(toType==String.class){//判断是否为String类型

Object[] obj=(Object[])value;

return format.format(obj[0]);

}

} catch (ParseException e) {

e.printStackTrace();

}

return null;

}

(3).配置消息资源文件UserAction-conversion.properties:"-"前办部分,为某一个类特定的

类型转换"-"后半部分:约定

createtime=com.starting.typechange.DataTypeChange:

createtime:文本框中的name值,类中需要转换类型的属性名

com.starting.typechange.DataTypeChange:转换类,给createtime转换类型的类

如果是通用的

java.util.?=com.starting.typechange.DataTypeChange

相关推荐