Java Web编程的主要组件技术——Struts核心组件

参考书籍:《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>
View Code

  <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>
View Code

  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 }
View Code

  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 }
View Code

  定义具体属性和相应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 }
View Code

    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>
View Code

    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>
View Code

 

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,不支持中文,所以需要转换编码格式

你可能感兴趣的:(Java Web)