参考书籍:《J2EE开源编程精要15讲》
Struts配置文件struts-config.xml
Struts核心文件,可配置各种组件,包括Form Beans、Actions、ActionMappings、全局转发GlobalForwards、数据源DataSource及插件Plugins。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> 3 4 <struts-config> 5 <form-beans > 6 <form-bean name="loginForm" type="struts.form.LoginForm" /> 7 8 </form-beans> 9 10 <global-exceptions /> 11 <global-forwards /> 12 <action-mappings > 13 <action 14 attribute="loginForm" 15 input="/login.jsp" 16 name="loginForm" 17 path="/login" 18 scope="request" 19 type="struts.action.LoginAction" 20 cancellable="true" > 21 <forward name="Success" path="/main.jsp" /> 22 <forward name="Fail" path="/register.jsp" /> 23 </action> 24 </action-mappings> 25 26 <message-resources parameter="struts.ApplicationResources" /> 27 </struts-config>
<form-beans>元素允许配置多个ActionForm类
name属性指定ActionForm的唯一标识名,Struts框架用该标识来引用这个Form Bean,必需
type属性指定ActionForm的完整路径名和类名,必需
动态ActionForm还需配置子元素<form-property>,指定表单字段
<action-mappings>元素帮助进行框架内部的流程控制,可将请求URI映射到Action类,关联Action对象和ActionForm对象,可定义多个<action>子
元素。
<action>子元素所描述的是特定请求路径和相应Action类之间的映射关系,Struts控制器将请求中的URI路径与诸多<action>元素的path属性匹
配,以选中特定映射
attribute属性设置和Action相关联的Form Bean在request/session内的属性key,通过request/session的getattribute(attribute)返回实例
forward属性指定局部转发项
input属性指定表单输入页面的URL路径
name属性指定同改Action关联的Form Bean的引用标识
path属性指定Action的访问路径,即在引用中的标识名,以"/"开头
type属性指定该Action类的完整路径和类名
scope属性指定同该Action类关联的Form Bean的存在范围(request和session),默认session
validate属性指定是否调用Form Bean的validate()方法,默认为true
<action>元素可包含多个<forward>子元素,定义转发动作
name属性指定转向标识名
path属性转向标识名所对应的转向页面
<global-forwards>元素定义整个应用程序内的全局转发,可定义多个<forward>子元素,用法同<action>
<message-resources>元素用于配置消息资源文件,以在应用的客户端界面输出本地化消息文本
parameter属性指定消息资源文件存放路径
Struts的中央控制器
多个组件分担控制器的工作,ActionServlet类、RequestProcessor类、Action类等,其中ActionServlet类是核心控制器。当ActionServlet接受到用户请求时,将执行如下流程:
1. 检索和用户请求匹配的ActionMapping实例,如果不存在,返回错误信息
2. 如果为ActionMapping配置了Form Bean,获取相应范围内的ActionForm实例。如果实例不存在,就创建一个,并保存客户提交数据
3. 根据配置信息决定是否验证表单(validate()方法),验证出错则返回input属性指定的页面,并显示错误信息
4. ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给对应Action,实例不存在则新建,调用Action的execute()方法
5. execute()方法返回一个ActionForward对象,如果该对象是JSP,则返回视图给用户;如果该对象是Action,则进入对应Action
1) ActionServlet类
第一次被加载后,调用init()方法,执行初始化工作。然后Web容器调用doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求
2) RequestProcessor类
ActionServlet的process()方法中实际处理请求的是RequestProcessor类的process()方法。Struts框架之允许应用程序存在一个ActionServlet类,但每个应用程序模块都有各自的RequestProcessor类实例。在ActionServlet的process()方法中,一旦选择了正确的应用程序模块,就会调用相应模块的RequestProcessor实例的process()方法来处理请求。
3) ActionServlet在web.xml中的配置
1 <servlet> 2 <servlet-name>action</servlet-name> 3 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 4 <init-param> 5 <param-name>config</param-name> 6 <param-value>/WEB-INF/struts-config.xml</param-value> 7 </init-param> 8 <init-param> 9 <param-name>debug</param-name> 10 <param-value>3</param-value> 11 </init-param> 12 <init-param> 13 <param-name>detail</param-name> 14 <param-value>3</param-value> 15 </init-param> 16 <load-on-startup>0</load-on-startup> 17 </servlet> 18 <servlet-mapping> 19 <servlet-name>action</servlet-name> 20 <url-pattern>*.do</url-pattern> 21 </servlet-mapping>
ActionServlet的URL映射是"*.do",在浏览器中输入任何后缀为".do"的URL时,系统会映射到ActionServlet
Action类及其相关类
1) Action类
通常设计为代替客户完成某种操作,是客户请求和业务逻辑操作间的桥梁。在Struts应用程序中,需要扩展Action类,提供execute()方法的一个实现。Action类通过getter方法从ActionForm对象中获得表单数据,调用模型组件处理这些数据,通过ActionMapping对象的findForward()方法获得一个ActionForward对象,把处理结果发给ActionForward对象所指目标
1 /* 2 * Generated by MyEclipse Struts 3 * Template path: templates/java/JavaClass.vtl 4 */ 5 package struts.action; 6 7 import struts.form.*; 8 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import javax.servlet.http.HttpSession; 12 13 14 import org.apache.struts.action.Action; 15 import org.apache.struts.action.ActionForm; 16 import org.apache.struts.action.ActionForward; 17 import org.apache.struts.action.ActionMapping; 18 19 /** 20 * MyEclipse Struts 21 * Creation date: 03-08-2015 22 * 23 * XDoclet definition: 24 * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true" 25 */ 26 public class LoginAction extends Action { 27 /* 28 * Generated Methods 29 */ 30 31 /** 32 * Method execute 33 * @param mapping 34 * @param form 35 * @param request 36 * @param response 37 * @return ActionForward 38 */ 39 public ActionForward execute(ActionMapping mapping, ActionForm form, 40 HttpServletRequest request, HttpServletResponse response) { 41 LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub 42 //从Form Bean中取出表单数据 43 String username=loginForm.getUsername(); 44 String password=loginForm.getPassword(); 45 46 //生成一个Session对象,在main.jsp和register.jsp中可以根据Session对象获取用户名 47 HttpSession session=request.getSession(true); 48 session.removeAttribute("username"); 49 session.setAttribute("username", username); 50 51 //调用业务逻辑组件,检查该用户是否已注册 52 LoginHandler login=new LoginHandler(); 53 boolean mark=login.checkLogin(username,password); 54 55 //根据查询结果跳转 56 String prompt; 57 if(mark) 58 prompt="Success"; 59 else 60 prompt="Fail"; 61 return mapping.findForward(prompt); 62 } 63 }
2) ActionMapping类
用来存储特定请求映射到特定Action的相关信息。封装了配置文件中action元素所包含的信息。在execute()方法中完成本地转发
3) ActionForward类
代表一个Web资源的逻辑抽象表现形式
ActionForm类及表单数据验证
ActionForm本质上是一种JavaBean,专门用来传递表单数据的DTO(Data Transfer Object)。包括表单数据验证的validate()方法和用于数据复位的reset()方法。ActionForm有request和session两种作用域,表示ActionForm实例的作用范围。
1. 创建ActionForm
1 /* 2 * Generated by MyEclipse Struts 3 * Template path: templates/java/JavaClass.vtl 4 */ 5 package struts.form; 6 7 import javax.servlet.http.HttpServletRequest; 8 import org.apache.struts.action.ActionErrors; 9 import org.apache.struts.action.ActionForm; 10 import org.apache.struts.action.ActionMapping; 11 12 /** 13 * MyEclipse Struts 14 * Creation date: 03-08-2015 15 * 16 * XDoclet definition: 17 * @struts.form name="loginForm" 18 */ 19 public class LoginForm extends ActionForm { 20 /* 21 * Generated fields 22 */ 23 24 /** username property */ 25 private String username; 26 27 /** password property */ 28 private String password; 29 30 /* 31 * Generated Methods 32 */ 33 34 /** 35 * Method validate 36 * @param mapping 37 * @param request 38 * @return ActionErrors 39 */ 40 public ActionErrors validate(ActionMapping mapping, 41 HttpServletRequest request) { 42 // TODO Auto-generated method stub 43 return null; 44 } 45 46 /** 47 * Method reset 48 * @param mapping 49 * @param request 50 */ 51 public void reset(ActionMapping mapping, HttpServletRequest request) { 52 // TODO Auto-generated method stub 53 } 54 55 /** 56 * Returns the username. 57 * @return String 58 */ 59 public String getUsername() { 60 return username; 61 } 62 63 /** 64 * Set the username. 65 * @param username The username to set 66 */ 67 public void setUsername(String username) { 68 this.username = username; 69 } 70 71 /** 72 * Returns the password. 73 * @return String 74 */ 75 public String getPassword() { 76 return password; 77 } 78 79 /** 80 * Set the password. 81 * @param password The password to set 82 */ 83 public void setPassword(String password) { 84 this.password = password; 85 } 86 }
定义具体属性和相应getter、setter方法,与表单中的输入域属性一一对应,覆写reset()和validate()方法
2. 配置ActionForm
<form-beans >
<form-bean name="loginForm" type="struts.form.LoginForm" />
</form-beans>
<form-beans>元素指定全体ActionForm配置,<form-bean>配置一个具体ActionForm类
3. 访问ActionForm
1) 使用Struts HTML标记库
如<html:form>,<html:text>等
2) 从request或session对象中取出ActionForm对象
如:LoginActionForm form=(LoginActionForm)request.getAttribute("loginActionForm");
3) 通过Action类的execute()方法直接访问ActionForm
表单数据验证
1) 重写validate()方法
1 /* 2 * Generated by MyEclipse Struts 3 * Template path: templates/java/JavaClass.vtl 4 */ 5 package struts.form; 6 7 import javax.servlet.http.HttpServletRequest; 8 9 import org.apache.struts.action.ActionErrors; 10 import org.apache.struts.action.ActionForm; 11 import org.apache.struts.action.ActionMapping; 12 import org.apache.struts.action.ActionMessage; 13 14 /** 15 * MyEclipse Struts 16 * Creation date: 03-08-2015 17 * 18 * XDoclet definition: 19 * @struts.form name="loginForm" 20 */ 21 public class LoginForm extends ActionForm { 22 /* 23 * Generated fields 24 */ 25 26 /** username property */ 27 private String username; 28 29 /** password property */ 30 private String password; 31 32 /* 33 * Generated Methods 34 */ 35 36 /** 37 * Method validate 38 * @param mapping 39 * @param request 40 * @return ActionErrors 41 */ 42 public ActionErrors validate(ActionMapping mapping, 43 HttpServletRequest request) { 44 ActionErrors errors=new ActionErrors(); 45 if((username==null)||(username.length()<3)){ 46 errors.add("name",new ActionMessage("error.username.required",username)); 47 } 48 if((password==null)||(password.length()<3)){ 49 errors.add("psw",new ActionMessage("error.password.required",password)); 50 } 51 return errors; 52 } 53 54 /** 55 * Method reset 56 * @param mapping 57 * @param request 58 */ 59 public void reset(ActionMapping mapping, HttpServletRequest request) { 60 // TODO Auto-generated method stub 61 } 62 63 /** 64 * Returns the username. 65 * @return String 66 */ 67 public String getUsername() { 68 return username; 69 } 70 71 /** 72 * Set the username. 73 * @param username The username to set 74 */ 75 public void setUsername(String username) { 76 this.username = username; 77 } 78 79 /** 80 * Returns the password. 81 * @return String 82 */ 83 public String getPassword() { 84 return password; 85 } 86 87 /** 88 * Set the password. 89 * @param password The password to set 90 */ 91 public void setPassword(String password) { 92 this.password = password; 93 } 94 }
2) 在资源文件ApplicationResources.properties中设置可能的验证错误的标识
3) 在配置文件struts-config.xml中,把<action>元素的validate属性设置为true并添加<message-resources>元素以指定资源文件存放路径
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> 3 4 <struts-config> 5 <form-beans > 6 <form-bean name="loginForm" type="struts.form.LoginForm" /> 7 8 </form-beans> 9 10 <global-exceptions /> 11 <global-forwards /> 12 <action-mappings > 13 <action 14 attribute="loginForm" 15 input="/login.jsp" 16 name="loginForm" 17 path="/login" 18 scope="request" 19 type="struts.action.LoginAction" 20 validate="true" 21 cancellable="true" > 22 <forward name="Success" path="/main.jsp" /> 23 <forward name="Fail" path="/register.jsp" /> 24 </action> 25 </action-mappings> 26 27 <message-resources parameter="struts.ApplicationResources" /> 28 </struts-config>
4) 在相应输入页面的相应位置加入错误标记<html:errors>,以输出可能的验证错误
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> 3 <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> 4 5 <html> 6 <head> 7 <title>JSP for LoginForm form</title> 8 </head> 9 <body> 10 <html:form action="/login"> 11 username : <html:text property="username"/><html:errors property="username"/><br/> 12 <font color="red"><html:errors property="name"/></font><br/> 13 password : <html:text property="password"/><html:errors property="password"/><br/> 14 <font color="red"><html:errors property="psw"/></font><br/> 15 <html:submit/><html:cancel/> 16 </html:form> 17 </body> 18 </html>
Struts常用标记库
参考http://blog.csdn.net/hollboy/article/details/9197025
应用实例 学生信息登记系统:http://pan.baidu.com/s/1o6OH5zk
PS:中文乱码解决方案
try{
name=new String(name.getBytes("ISO-8859-1"),"utf-8");
sex=new String(sex.getBytes("ISO-8859-1"),"utf-8");
}catch(Exception e){
e.printStackTrace();
}
由于Myeclipse的默认编码格式为ISO-8859-1,不支持中文,所以需要转换编码格式