在构建一个简单的基于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标记,如下:
<% @ 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;
}
}
* 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的配置文件
<! 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配置文件
< 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 >