zoukankan      html  css  js  c++  java
  • 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,不支持中文,所以需要转换编码格式

  • 相关阅读:
    torrent&BT百科
    网页flv下载探索_1
    u-boot FIT image介绍_转自“蜗窝科技”
    28个Unix/Linux的命令行神器_转
    程序员的“纪律性”_转自“蜗窝科技”
    “极致”神话和产品观念_转自“蜗窝科技”
    制作自己的嵌入式Linux电脑_转
    buildroot--uboot&kernel&rootfs全编译工具
    (转)编码规范系列(一):Eclipse Code Templates设置
    matlab图片清晰度调整
  • 原文地址:https://www.cnblogs.com/cqq626/p/4321810.html
Copyright © 2011-2022 走看看