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>

  <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

时间: 2024-10-26 04:24:27

Java Web编程的主要组件技术——Struts核心组件的相关文章

Java Web编程的主要组件技术——Struts入门

参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少,耦合度较低.它定义了自己的标签库来实现是视图层,创建了一个内在的Servlet,叫ActionServlet,作为自己的控制器,建立一个叫Action类的对象实现业务逻辑.视图组件和业务逻辑组件的关系在struts-config.xml的配置文件中声明.当Struts应用程序启动时,它首先从struts-c

Java Web编程的主要组件技术——Struts的高级功能

参考书籍:<J2EE开源编程精要15讲> Struts对国际化的支持 "国际化"(I18N)指一个应用程序在运行时能根据客户端请求所来的国家/地区.语言的不同显示不同的用户界面.要用Struts实现国际化,所要用的各种语言版本的"标签"信息存放在不同的属性文件中,每个文件对应一个语言版本.文件名后缀必须为properties,前缀名由开发者确定,其中的语言种类字段必须是有效的ISO(International Standardization Organi

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

参考书籍:<J2EE开源编程精要15讲> Hibernate配置文件 1) hibernate.cfg.xml 1 <?xml version='1.0' encoding='UTF-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/

Java Web编程的主要组件技术——MVC设计模式

参考书籍:<J2EE开源编程精要15讲> MVC(Model View Controller),Model(模型)表示业务逻辑层,View(视图)代表表述层,Controller(控制)表示控制层. 在Java Web应用程序中, View部分一般用JSP和HTML构建.客户在View部分提交请求,在业务逻辑层处理后,把结果返回给View部分显示 Controller部分一般用Servlet组成,把用户的请求发给适当的业务逻辑组件处理:处理后又返回Controller,把结果转发给适当的Vie

Java Web编程的主要组件技术——JDBC

参考书籍:<J2EE开源编程精要15讲> JDBC(Java DataBase Connectivity)是Java Web应用程序开发的最主要API之一.当向数据库查询数据时,Java应用程序先调用JDBC API,然后JDBC API把查询语句提交给JDBC驱动器,JDBC驱动器把查询语句转化为特定数据库理解的形式,JDBC驱动器检索SQL查询的结果,并转化为Java应用程序使用的等价JDBC API类和接口. JDBC驱动器 JDBC软件包本身不能链接任何数据库,它只是一个API框架,需

Java Web编程的主要组件技术——Servlet

参考书籍:<J2EE开源编程精要15讲> Servlet是可以处理客户端传来的HTTP请求,并返回响应,由服务器端调用执行,有一定编写规范的Java类. 例如: 1 package test; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 impo

Java Web编程的主要组件技术——Hibernate入门

参考书籍:<J2EE开源编程精要15讲> Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系型数据库中的表格与表格之间的关系.它是Java应用与关系数据库之间的桥梁,负责Java对象和关系数据之间的映射.Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据库访问API. Hibernate的体系结构 Hibernate通过配置文件( hibernate.prope

JAVA web编程经验之: 一个请求一个事务

对于一个web请求,你会开启几个事务呢? 或许你没注意过吧. 又或许你不会对代码,性能要求太高,所以.... 一个请求一个事务, 因为一个事务往往和一个数据库连接关联, 如果开启了多个事务的话,也就意味着多个数据库连接, 性能不高吧? 前提 1.项目的代码结构分层如下: web层 ->  service层 -> infrastructure层(或DAO层) 2.所有事务都添加在 service层, 通过AOP(或其他类似的技术)实现 先看代码(一个Spring Controller 的调用代码

java web学习:三大组件 Listener基础

1.概念 事件源:被监听的对象 .监听器主要监听三个域对象 ,分别是 request  session  servletContext 监听器:用来监听某个对象状态变化的组件 响应行为:监听器监听的对象相应的状态发生变化时出发的动作. 2.Listener分类 在java web中,监听器的种类比较多,可以按照事件源(监听的对象)进行分类,也可以按照监听的动作进行分类.这里按照监听的动作进行分类. (1)监听域对象自身创建和销毁的监听器: ①ServletContextListener接口 监听