您的位置:首页 > 编程语言 > Java开发

(Struts重构)构建一个简单的基于MVC模式的JavaWeb

2013-12-01 16:54 483 查看

Struts的中央控制器

在Struts框架中,有多个组件分担控制器的工作,它们分别是ActionServlet类,RequestProcessor类和Action类等,其中ActionServlet是Struts框架中的核心控制器。

Struts应用程序处理用户请求的一般过程

ActionServlet类作为中心Servlet,负责处理所有到来的用户请求。当ActionServlet接收到一个用户请求时,将执行如下流程:

1.检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的错误信息。

2.如果为ActionMapping配置了Form Bean,则获取相应范围内的ActionForm实例。如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

3.根据ActionMapping配置信息决定是否需要验证表单。如果需要验证,就调用ActionForm的validate()方法。

4.如果ActionForm的validate()方法返回null,或者返回一个不包含任何ActionMessage的ActionErrors对象,就表明表单验证成功,继续执行下一步。否则返回input属性指定的页面,并向用户显示ActionErrors集合中的错误信息。

5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,则先创建这个实例,然后调用Action的execute方法。

6.Action的execute方法返回 一个ActionForward对象,ActionServlet将请求转发到这个ActionForward对象指定的组件,通常是一个JSP组件或其他Action。

7.如果ActionForward对象指向一个JSP组件,则将该JSP生成的动态页面返回给用户;如果ActionForward对象指向的仍然是一个Action,则从第1步重新开始执行!

从上述过程可知ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类。Struts的启动通常从加载ActionServlet开始。Web容器会在首次启动或Struts应用的第一个请求到达时加载ActionServlet。

ActionServlet第一次被加载后,其init()方法被调用。在init()方法中,Struts框架执行所有必要的初始化工作。

然后,Web容器将调用ActionServlet的doPost()或doGet()方法来处理用户请求,而它们实际上都是调用process()方法具体处理请求的.

构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 View有紧密的耦合度,因为在Controller代码中夹杂了组件部份的名称!

那么在这一篇我,我再改用Struts框架来构建这个系统,要注意的是,构建Struts应用程序时,一般不用自己去写中心控制器ActionServlet代码,因为ActionServlet是Struts框架的一个内置组件。但我们需要编写ActionForm和Action等组件的代码。

开发步骤如下:

Step1:设计数据表,与构建一个简单的基于MVC模式的JavaWeb 里面的表相同。

Step2:构建JSP页面,注意要把JSP中的HTML梅花鹿改为Struts特有的标记。

Step3:构建ActionForm,ActionForm其实是一个JavaBean,可以手工编写它,也可以使用工具生成!

Step4:构建Action,可以手工编写,也可以用工具!

Step5:构建模型组件和数据访问组件,与构建一个简单的基于MVC模式的JavaWeb 的相同!

Step6:构建Struts配置文件!

Step7:编译,打包,部署!

详细设计:

A:构建视图组件JSP页面,可以直接COPY构建一个简单的基于MVC模式的JavaWeb 中的三个页面,我们仅仅修改login.jsp页面,引入Struts标记,如下:

<%@ page language="java" pageEncoding="GBK"%>
<%@ 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 LoginHandlerForm form</title>
</head>
<body>
<html:form action="/loginHandler">
userName : <html:text property="userName"/><html:errors property="userName"/><br/>
userPwd : <html:text property="userPwd"/><html:errors property="userPwd"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>

B:构建数据访问组件,与构建一个简单的基于MVC模式的JavaWeb 一样,COPY过来

C:构建模型组件LoginHanlder,与构建一个简单的基于MVC模式的JavaWeb 一样,COPY!

D:构建ActionForm,代码如下:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package struts.form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

/**
* Struts框架的ActionForm对象,它可用来在用户和业务层之间舆用户的输入数据。
* ActionForm也叫FormBean.Struts框架会自动从请求中惧输入数据,再将 这些
* 数据交给一个使用FormBean的Action对象,接着FormBean可以再交给业务层
*/
public class LoginHandlerForm extends ActionForm {
/*
* Generated fields
*/

/** userName property */
private String userName;

/** userPwd property */
private String userPwd;

//验证方法,主要用于验证视图上的数据,例如非空之类,
//如果要进行业务验证,则应该在Action中进行!
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {

return null;
}
//初始化首先调用的方法
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getUserPwd() {
return userPwd;
}

public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}

E:构建Action
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package struts.action;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.LoginHandler;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import struts.form.LoginHandlerForm;

/**
* MyEclipse Struts
* Creation date: 01-06-2007
*
* XDoclet definition:
* @struts.action path="/loginHandler" name="loginHandlerForm" input="/login.jsp" scope="request" validate="true"
*/
public class LoginHandlerAction extends Action {

/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

LoginHandlerForm loginHandlerForm = (LoginHandlerForm) form;// TODO Auto-generated method stub
//从Form中取得表单数据
String userName = loginHandlerForm.getUserName();
String userPwd = loginHandlerForm.getUserPwd();

//生成一个Session对象
HttpSession session = request.getSession(true);
session.removeAttribute("userName");
session.setAttribute("userName", userName);

//生成一个ArrayList
ArrayList arr = new ArrayList();
arr.add(userName);
arr.add(userPwd);

String forward;

//调用模型组件
LoginHandler login = new LoginHandler();
boolean flag = login.checkLogin(arr);
if(flag)
forward = "success";
else
forward = "fail";

//转向
return mapping.findForward(forward);

}
}

F:构建Struts的配置文件
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<!-- 表单配置 -->
<form-beans >
<form-bean name="loginHandlerForm" type="struts.form.LoginHandlerForm" />
</form-beans>
<!-- 全局异常 -->
<global-exceptions />
<!-- 全局转发 -->
<global-forwards />

<!-- 表单Action映射 -->
<action-mappings >
<action
attribute="loginHandlerForm"
input="/login.jsp"
name="loginHandlerForm"
path="/loginHandler"
scope="request"
type="struts.action.LoginHandlerAction" >
<!-- action与视图组件的联系在配置文件中写,这样就大大降低了Action和VIEW的耦合性 -->
<forward name="success" path="/main.jsp" />
<forward name="fail" path="/register.jsp" />
</action>

</action-mappings>
<!-- 资源文件 -->
<message-resources parameter="struts.ApplicationResources" />
</struts-config>

WEB配置文件
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list>
<welcome-file>/login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
小结:在开发Struts时,不需要开发人员自己编写中心控制器 的代码,但需要开发ActionForm,和Action组件,而且它 的JSP页面中的HTML标记需要转化为Struts自定义标记。这是开发Struts应用程序与开发一般基于MVC模式的主要不同!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: