解析StrutsLoginDemo中的Form, Action And JSP
在StrutsLoginDemo中,我们New→Form, Action And JSP后生成了以下文件:
JSP:   WebRoot/ userLogin.jsp
Form: src/com.yourcompany.struts.form/UserLoginForm.java
Action:src/com.yourcompany.struts.action/UserLoginAction.java
以下解析他们之间的组织关系:
一.Struts配置文件Struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="userLoginForm" type="com.yourcompany.struts.form.UserLoginForm" />
  </form-beans>
  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="userLoginForm"
      input="/userLogin.jsp"
      name="userLoginForm"
      path="/userLogin"
      scope="request"
      type="com.yourcompany.struts.action.UserLoginAction">
      <forward name="success" path="/userLoginSuccess.jsp" />
      <forward name="failure" path="/userLogin.jsp" />
    </action>
  </action-mappings>
  <message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>
解析:
这个文件指明了Form, Action And JSP三位一体的逻辑关联和组织方法。
1.<form-beans >配置ActionForm,至少必须指定两项:
    name:该项用于标识ActionForm的Id,以便于传递给Action进行使用
    type:ActionForm的实现类                             
2.<action>配置Action,参数说明:
attribute—该action的归属
input—action对应的请求页面
name—和bean标签的name对应,是这个action对应的哪一个bean
path—ActionSerlvet将用户的请求转发与之同名的Action,同名的意思是将请求 的".do"后缀去掉。匹配Action的path属性值 
scope—请求范围,有两种:request,session
type —指定对应的action类
forward—将Action的转发映射到实际的jsp页面,在实际编程时应该用逻辑名进行转发 
    一个Action可以有ActionForm,也可以没有ActionForm。如果是post提交的一般会有ActionForm。比如:<form id="frm1" action="loginAction.do">,如果是通过get提交则不会有ActionForm,但是Action总是会有的,因为要处理业务逻辑。比如:<a href="shopAddAction.do">
二.JSP网页文件userLogin.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> 
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
 
<html> 
    <head>
    <title>JSP for UserLoginForm form</title>
    </head>
    <body>
    <html:form action="/userLogin">
    userName : <html:text property="userName"/><html:errors property="userName"/><br/>
    password : <html:password property="password"/><html:errors property="password"/><br/>
    <html:submit/><html:cancel/>
    </html:form>
    </body>
</html>
解析:
1.<html:form action="/userLogin">action 与上面的path对应就唯一确定了actionform。
2.userName : <html:text property="userName"/>和
   password : <html:password property="password"/>
   分别定义了登录界面userLogin.jsp中的用户text控件及其property、密码password控件及其property。
三.ActionForm类实现UserLoginForm.java
package com.yourcompany.struts.form;
import org.apache.struts.action.ActionForm;
public class UserLoginForm extends ActionForm {
    /** userName property */
    private String userName;
    /** password property */
    private String password;
    
    public String getUserName() {
       return userName;
    }   
    public void setUserName(String userName) {
       this.userName = userName;
    }
    public String getPassword() {
       return password;
    }   public void setPassword(String password) {
       this.password = password;
    }
}
解析:
这个类主要定义了两个String类型的变量userName和password(userLogin.jsp中的两个
property),并定义了其存取方法(get\set),我们可以类比MFC中的DDX/DDV控件数据校
验机制。
四.Action类实现UserLoginAction.java
package com.yourcompany.struts.action;
import javax.servlet.http.HttpServletRequest;
public class UserLoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
           HttpServletRequest request, HttpServletResponse response) {
       UserLoginForm userLoginForm = (UserLoginForm) form;// TODO Auto-generated method stub
         if (userLoginForm.getUserName().equals("fan") && userLoginForm.getPassword().equals("20080808"))
            {
                request.setAttribute("userName", userLoginForm.getUserName());
                return mapping.findForward("success");
            }
            else
            {
                return mapping.findForward("failure");
            }
    }
}
解析:
这个类中主要定义了execute方法对数据进行处理。
首先定义类UserLoginForm的实例userLoginForm,然后通过调用其get\set方法来提取数据,并根据数据作出相应处理。
参考:
http://www.blogjava.net/happy-java3000/articles/41710.html
http://dev.csdn.net/author/baggio785/ae23a10757e44fd2acd2ebf8cb44ecd8.html

评论