• 1. Struts2.0
  • 2. struts2.0体系介绍struts2配置 客户端请求处理
  • 3. struts2
  • 4. struts2.0流程filterstruts.xmlaction发送请求给服务器filter接收到请求到到struts中找匹配的action找到匹配的action,调用action处理请求123action返回配置中所定义的页面,再到配置文件中找到匹配的页面4找到JSP页面,将由JSP页面生成的HTML代码发还给客户端5将返回出来的HTML代码给客户端6
  • 5. 使用struts2.0struts2.0包 struts基本包包括: commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar struts2-core-2.0.12.jar xwork-2.0.6.jarstruts核心包
  • 6. 加载struts2要使用struts2,必须在web.xml中进行配置以过滤器的形式加载struts2过滤器所在包: org.apache.struts2.dispatcher.FilterDispatcher
  • 7. 加载struts2以过滤器的形式加载struts2 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* struts2以过滤器的形式加载到工程中,在web.xml中配置:
  • 8. 加载struts2struts2的配置文件默认应放在src目录下,默认以struts.xml命名
  • 9. struts2常用配置-包配置Struts2框架使用包来管理Action和其它组件。每个包就是多个Action和其它一些组件的集合。 在struts.xml文件中package元素用于定义包配置,每个package元素定义了一个包配置。它的常用属性有:属性名是否必填作用name必填指定包的名字namespace可选指定该包的命名空间extends必填指定该包继承其他包。继承其它包,可以继承其它包中的Action定义和其它组件等
  • 10. struts2常用配置-包配置 指定包的名字指定继承的包,继承其它包,可以继承其它包中所定义的所有组件。
  • 11. struts2常用配置-命名空间配置命名空间在包中指定 给包指定命名空间 struts2中的命名空间起到模块化的作用。这个包下的所有Action(请求的处理类),都应该以: /[命名空间名]/[Action名]来访问 命名空间的名字都应该以“/”开头,如果不配置命名空间,则默认的就是namespace=“/”。 一个包下不能存在名字相同的Action
  • 12. struts2常用配置-Action配置 配置Action name属性配置Action的名字 class属性配置Action类的完整类路径,说明 用哪个类处理提交的请求。
  • 13. struts2常用配置-Action配置public class LoginAction extends ActionSupport { private String userName; private String password; public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception { return SUCCESS; } }每个请求处理类必须继承ActionSupportLoginAction.java对应页面表单元素名对应的表单元素名必须给出set方法处理请求的方法。方法名默认为execute

    login.htmlstruts2中,所提交的请求应以.action结尾
  • 14. struts2常用配置-Action配置 使用Action类中指定的方法来处理请求 method属性配置使用Action中指定的方法来处理 提交的请求,如果不配置此属性,那么struts2默认会 自动调用Action类的execute方法来处理请求。
  • 15. struts2常用配置-Action配置(result) /suc.jsp /error.jsp 配置请求处理结束后的跳转目标public String execute() throws Exception { return SUCCESS; }struts.xmlLoginAction.java struts2处理类的父类中定义了一些常量用来对应处理结束后的跳转目标,然后找到其对应的页面进行跳转。比如: SUCCESS对应名为success的result ERROR对应名为error的result跳转目标是某个页面时,前面一定要加”/”
  • 16. struts2常用配置-Action配置(result)如果跳转的目标是某个action,则配置: test /error.jsp /login.jsp 声明跳转的方式struts.xml
  • 17. struts2常用配置-Action配置(result节点type属性配置清单)属性名功能chain 用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息。dispatcher 用来转向页面,通常处理JSP,这是默认的结果类型freemaker 处理FreeMarker模板httpheader 控制特殊HTTP行为的结果类型stream 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据velocity 处理Velocity模板xslt 处理XML/XLST模板plainText 显示原始文件内容,例如文件源代码redirect 重定向到一个URL ,被跳转的页面中丢失传递的信息,如requestredirectAction 重定向到一个Action ,跳转的页面中丢失传递的信息,如requestredirect-action 重定向到一个Action ,跳转的页面中丢失传递的信息,如request
  • 18. struts2常用配置-Action配置(result节点type属性配置清单)注:redirect与redirect-action区别 一、使用redirect需要后缀名,使用redirect-action不需要后缀名 二、type="redirect"的值可以转到其它命名空间下的action,而redirect-action只能转到同一命名空下的 action,因此它可以省略.action的后缀直接写action的名称。 如: viewTask.action viewTask
  • 19. struts2常用配置-多配置文件在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。 …………
  • 20. 例:struts2实现简单登陆功能—加载struts2 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* index.jsp web.xml
  • 21. 例:struts2实现简单登陆功能—struts.xml /suc.jsp /error.jsp struts.xml
  • 22. 例:struts2实现简单登陆功能—LoginActionpackage com.wepull.login; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String userName; private String password; public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } @Override public String execute() throws Exception { if ("admin".equals(userName) && "123".equals(password)) { return SUCCESS; } else { return ERROR; } } }LoginAction.java
  • 23. 例:struts2实现简单登陆功能—login.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> My JSP 'index.jsp' starting page
    Login.jsp
  • 24. 问题问题:如果需求要求对登陆名或密码有长度限制或者某些格式的限制,需要我们去验证,怎么做呢?
  • 25. struts2验证在Struts2中最简单的验证数据的方法是使用validate。Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2会返回名为“input”的result(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。
  • 26. struts2验证我们看下刚才登陆例子中的LoginAction类,里面除了和页面表单元素对应的属性,就是execute方法。其实,在execute方法中也可以进行验证,但是如果把请求处理和验证全写在一个方法中,那么这个方法就显的太臃肿了。我们可以对这个类改善一下。 在LoginAction中覆盖父类的validate方法。 struts2会在调用execute方法之前调用validate方法,如果验证不通过,我们使用addFieldError或addActionError或addActionMessage方法将错误信息添加到相对应的错误级别中取,struts2一旦发现存在错误信息,则跳转到名为input的result,并将错误信息传递到页面。也不会执行execute方法。
  • 27. struts2验证—validate方法package com.wepull.login; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { ……………… @Override public void validate() { if ("".equals(userName)) { addActionError("userName can not be null!"); } if("".equals(password)){ addActionError("password can not be null!"); } } ……………… }LoginAction.java使用validate方法验证,当用户名或密码为空时,使用addActionError方法添加错误信息,由struts2自动跳转到result名为input的页面,并将错误信息发送给页面
  • 28. struts2验证—添加配置 /suc.jsp /error.jsp /login.jsp struts.xml配置名为input的result
  • 29. struts2验证—页面显示<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> My JSP 'index.jsp' starting page
    引入Struts2的S标签用S:actionerror获取错误信息login.jspS标签是struts2中定义的一套标签,就实用性来讲, 远远超过了struts1中定义的标签
  • 30. 问题页面效果显示如下: 上例中,使用addActionError方法存放错误信息,这属于 Action级别的。在struts2中,还可以使用另外一种方法 来传递错误信息,这个方法是addFieldError,这个错误 级别就是属于字段级别的。问题: 需求中不希望错误信息全部显示在一个位置,而是希望将错误 信息出现在每个出现错误的文本框附近,这个时候使用 addActionError方法传递错误信息显然不适用,那该怎么办呢?
  • 31. struts2验证—validate方法(字段级别)package com.wepull.login; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { ……………… @Override public void validate() { if ("".equals(userName)) { addFieldError("userName", "userName can not be null"); } if("".equals(password)){ addFieldError("password", "password can not be null"); } } ……………… }LoginAction.java使用addFieldError方法添加错误信息,这个方法有两个参数,第一个参数说明对应的表单元素名,第二个参数是错误信息。
  • 32. struts2验证—添加配置配置不变,和上例一样 /suc.jsp /error.jsp /login.jsp struts.xml配置名为input的result
  • 33. struts2验证—页面显示(字段级别)<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> My JSP 'index.jsp' starting page


    使用S标签添加表单元素login.jsp当字段级别的错误信息传递到页面上来时,struts2会自 动将错误信息显示到所对应的表单元素附近。
  • 34. struts2验证—页面效果(字段级别)页面效果显示如下:
  • 35. struts2—国际化(I18N)I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化” 国际化是商业系统中不可或缺的部分,无论学习任何web框架,国际化都是必须掌握的技能。struts提供了一套国际化机制,使用起来十分方便
  • 36. struts2—国际化(I18N)—添加配置新建两个资源文件,资源文件的命名格式为: [baseName] + _语言码_国家码.properties 在struts.xml中的配置如下: /suc.jsp /error.jsp /index.jsp struts2配置文件中,constant节点用来配置struts2中 的常量,这里配置的是国际化资源文件,表示资源文件 以message开头,后面接_语言码_国家码配置国际化常量,name属性表示配置的常量名,value属性指定进行国际化的资源文件名开头字符
  • 37. struts2—国际化(I18N)—添加资源文件在和struts.xml同级目录下添加三个资源文件: message.properties message_zh_CN.properties message_en_US.properties因为在struts.xml中配置了资源文件以message开头,所以这些资源文件的命名都是以message开头。 message_en_US是英语-美国 message_zh_CN是中文-中国message.properties是默认的资源 文件。从相对应语言的资源文件中 ,如果取不到相应的值,则到 message.properties中找
  • 38. struts2—国际化(I18N)—资源文件login.userName=userName login.password=password login.submit=submitlogin.userName=\u7528\u6237\u540D login.password=\u5BC6\u7801 login.submit=\u767B\u9646message_zh_CN.propertiesmessage_en_US.properties中文的资源文件,一定要将中文转成UTF-8编码的字符,不然会出现乱码
  • 39. struts2—国际化(I18N)—页面国际化<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> <s:text name="login.userName"></s:text> login.jsp从资源文件中获取字符的三种方式
  • 40. 问题将浏览器语言设为中文效果: 将浏览器语言设为英文效果问题:我们只是进行了页面的国际化,但是如果验证信息 返回的字符串和页面语言不匹配怎么办呢?
  • 41. struts2—国际化(I18N)—错误信息国际化我们先在资源文件中添加两个错误信息 在message_zh_CN中添加: 在message_en_US中添加:login.userName.null=\u7528\u6237\u540D\u586B\u5199\u9519\u8BEF login.password.null=\u5BC6\u7801\u586B\u5199\u9519\u8BEFlogin.userName.null=userName invalid login.password.null=password invalid
  • 42. struts2—国际化(I18N)—action取出错误信息package com.wepull.login; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { ……………… @Override public void validate() { if ("".equals(userName)) { addFieldError("userName", getText("login.userName.null")); } if("".equals(password)){ addFieldError("password", getText("login.password.null")); } } ……………… }LoginAction.java在Action中使用getText方法取出资源文件,将资源文件中的字符传递到页面上。
  • 43. 总结加载struts2 struts2配置文件 包 action 常量 struts2处理请求的方法 验证方法 国际化
  • 44. struts2进阶
  • 45. struts结构图