在构建一个简单的基于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模式的主要不同!
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
- Spring学习(二)——使用Gradle构建一个简单的Spring MVC Web应用程序
1.新建一个Gradle工程(Project) 在新建工程窗口的左侧中选择 [Gradle],右侧保持默认选择,点击next,模块命名为VelocityDemo. 2.在该工程下新建一个 module ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站 ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- Django入门第一步:构建一个简单的Django项目
Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...
- 利用angular4和nodejs-express构建一个简单的网站(五)—用户的注册和登录-HttpClient
上一节简单介绍了一下利用angular构建的主路由模块,根据上一节的介绍,主页面加载时直接跳转到用户管理界面,下面就来介绍一下用户管理模块.启动应用后,初始界面应该是这样的: 用户管理模块(users ...
随机推荐
- CTL_CODE 宏 详解
CTL_CODE宏 CTL_CODE:用于创建一个唯一的32位系统I/O控制代码,这个控制代码包括4部分组成: DeviceType(设备类型,高16位(16-31位)), Function(功能2- ...
- Java中关于final关键字
final关键字,大学时一直没有理解,伴随到工作,郁闷......也可能大学真的没认真去学习 首先,final给人一看英语单词 不就是最终的嘛,最终的什么的呢 ? 小张现在就带大家 学习下..... ...
- jQuery中的$.extend方法总结
原文见:jQuery.extend()函数详解 Jquery的扩展方法extend是我们在写插件的过程中常用的方法,但是经常容易搞不清楚以下两个写法的关系: 1.$.extend(dest,src1, ...
- 使用NPOI将数据库里信息导出Excel表格并提示用户下载
使用NPOI进行导出Excel表格大家基本都会,我在网上却很少找到导出Excel表格并提示下载的 简单的代码如下 //mvc项目可以传多个id以逗号相隔的字符串 public ActionResult ...
- 推荐大家一本学习php模式的书
对我来讲,写程序不是码代码,不想只是简单的将类拿来调用,然后功能实现了,可是以后要做一些扩展或者是修改就要对代码大刀阔斧. 在网站的开发过程中,使用一些框架,团队就可以在一定的程度上,分工合作.但是当 ...
- mysql null值转换
1.如果为空返回0 select ifnull(null,0) 2.如果为空返回0,否则返回1 select if(isnull(col),0,1) as col.
- OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...
- tomcat j2ee 目录结构
一.TOMCAT的目录结构 /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和w ...
- scheme 宏macro写法
scheme里的宏不同的实现有不同的写法: 1.mzscheme的define-macro (mzscheme也就是pltschme,也就是drracket,没有define-macro这个关键字) ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...