关于struts2中prepare接口实现数据准备
- 格式:docx
- 大小:27.88 KB
- 文档页数:6
1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。
(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。
随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。
注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。
Struts2相关Struts2是一个按照MVC模式设计的web层框架,其实Struts2就是一个大大的filter,我们可以在web.xml文件中讲符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理!Struts2的核心FilterDispatcher, 从2.1.3版本开始, 换成了StrutsPrepareAndExecuteFilter. 官方为什么要做这个升级呢?首先看下官方给的Struts2工作原理图:Struts2工作原理(基于看完上图的理解):当一个HttpServletRequest请求来了,先经过ActionContextCleanUp过滤器,清除Action环境,再经过其他的过滤器,例如说SiteMesh和用户自定义过滤器等等, 最后到达Struts2的核心过滤器StrutsPrepareAndExecuteFilter,此时,StrutsPrepareAndExecuteFilter会去找ActionMapping看此Action路径是否存在,如果存在,则会参照Struts.xml文件产生Action的代理,并且执行Action,Struts2很多功能是靠拦截器完成的,所以这个Action代理真正调用Action的处理请求的方法的时候会经过拦截器1,2,3,才真正调用Action的方法,Action方法结束后会返回一个视图,视图也会去参照ActionMapping,还会参照Template(JSP,FreeMarker),此时,拦截器会再次拦截(说明Struts2的拦截器是进入Action和返回结果的时候都会拦截的,这比Filter好!),最后产生HttpServletResponse,相应结果!我们也看到了, 老版本上面, 我们需要的别的过滤器全部要放在Struts2的过滤器之前. 但是我现在有个需求: 我想在我的过滤器里面做一些事,需要Struts2的环境(ActionContext), 但是又需要在Struts2的Action执行之前. 这个时候, 老版本的那个过滤器就只能两眼望青天了.打个比方, 好比一个病人要做手术, 做手术需要打麻药(自定义过滤器)和动手术(Struts2的过滤器), 请问打麻药要怎么打呢? 不能让病人站着吧.. 所以首先要准备一个床(ActionContext), 之后打麻药, 再手术. 这也就是StrutsPrepareAndExecuteFilter真正的含义. 可以分成StrutsPrepareFilter,StrutsExecuteFilter, 如果没有像之前那样的需求,我们一般都用StrutsPrepareAndExecuteFilter就可以了.。
毕业论文开题报告
学生姓名:学号:
学院、系:电子与计算机科学技术系
专业:网络工程
论文题目:基于java的动漫网站设计与实现
指导教师:
2015年3月 18日
开题报告填写要求
1.开题报告作为毕业论文答辩委员会对学生答辩资格审查的依据材料之一。
此报告应在指导教师指导下,由学生在毕业论文工作前期内完成,经指导教师签署意见及所在系审查后生效;
2.开题报告内容必须用按教务处统一设计的电子文档标准格式(可从教务处网页上下载)打印,禁止打印在其它纸上后剪贴,完成后应及时交给指导教师签署意见;
3.学生写文献综述的参考文献应不少于15篇(不包括辞典、手册)。
文中应用参考文献处应标出文献序号,文后“参考文献”的书写,应按照国标GB 7714—87《文后参考文献著录规则》的要求书写,不能有随意性;
4.学生的“学号”要写全号(如02011401X02),不能只写最后2位或1位数字;
5. 有关年月日等日期的填写,应当按照国标GB/T 7408—94《数据元和交换格式、信息交换、日期和时间表示法》规定的要求,一律用阿拉伯数字书写。
如“2004年3月15日”或“2004-03-15”;
6. 指导教师意见和所在系意见用黑墨水笔工整书写,不得随便涂改或潦草书写。
毕业论文开题报告。
Struts2的工作流程及配置文件--- ---Struts2.0的流程图从图中看到Struts2的工作流程如下:1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter><filter-name>setCharactor</filter-name><!-- 配置字符过滤--><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter><filter-name>struts2</filter-name><!-- 配置Struts2过滤器--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>setCharactor</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。
struts2核心工作流程与原理做为一名技术人员,听到太多关于.net和java的比较的话题。
我想对那些技术人员说,请先了解一下什么是java(或者.net)吧,其实你根本不了解。
这是Struts2官方站点提供的Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。
注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher。
3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。
下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;ServletContext servletContext = filterConfig.getServletContext();// 在这里处理了HttpServletRequest和HttpServletResponse。
一、发展历史及简介发展历史Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages、Servlet、标签库以及面向对象的技术水准。
Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。
这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。
这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。
当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。
同样,软件工程师使用Struts为业务应用的每一层提供支持。
它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。
我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。
如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。
早期Smalltalk程序语言便采用了MVC(Model-View-Controller)模式(Patterns)以增加程序代码弹性,MVC模式将程序代码整理切割为三部分,Model部分是业务与应用领域(Business domain)相关逻辑、管理状态之对象,Controller部分接收来自View所输入的资料并与Model部分互动,struts业务流程控制(Flow Control)之处,View部分则负责展现资料、接收使用者输入资料。
在Java应用中,JFC/Swing、AWT、JSP皆是可用作View的技术规格,而JavaBean与Enterprise JavaBean规格则可用于Model程序代码,一旦应用程序以MVC模式加以适当的分割,Model部分程序代码可在不同使用者接口外观的应用程序中重复使用。
随着JSP与Servlet技术大量应用于以Web为基础的应用程序,Java开发人员群体认为应以较佳的模式以提升Web应用程序的可维护性与重复使用性。
Action 包下面的class文件:package action;import erDao;import erDaoImp;import er;public class UserAction {private User user;public String add(){UserDao userDao = new UserDaoImp();try {userDao.save(user);return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String update(){UserDao userDao = new UserDaoImp();try {userDao.updata(user);System.out.print("----");return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String delete(){UserDao userDao = new UserDaoImp();try {userDao.deleteById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public String show(){UserDao userDao = new UserDaoImp();try {user = userDao.findById(user.getId());return"success";} catch (Exception e) {e.printStackTrace();return"error";}}public User getUser() {return user;}public void setUser(User user) {er = user;}}package action;import java.util.List;import erDao;import erDaoImp;import er;public class UserListAction {private List<User> users;public List<User> getUsers() {return users;}public void setUsers(List<User> users) { ers = users;}public String execute(){UserDao userDao = new UserDaoImp();try {users = userDao.findAll();return"success";} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return"error";}}}Dao 下面的class文件package dao;import java.util.List;import er;public interface UserDao {public void save(User user) throws Exception;public void updata(User user) throws Exception;public void deleteById(int id) throws Exception;public User findById(int id) throws Exception;public List<User> findAll() throws Exception;}Daoimpl包下面的class文件package daoimp;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import util.DBUtil;import erDao;import er;public class UserDaoImp implements UserDao {static final String insert = "insert into t_user(username,pwd,age) values(?,?,?)";static final String findAll = "select * from t_user";static final String delete = "delete from t_user where id=?";static final String findById = "select * from t_user where id=?";static final String update = "update t_user set username=?,pwd=?,age=? where id=?";public List<User> findAll() throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findAll);ResultSet rs = pst.executeQuery();List<User> users = new ArrayList<User>();while(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));users.add(user);}con.close();return users;}public User findById(int id) throws Exception {Connection con = DBUtil.getConnection();PreparedStatement pst = con.prepareStatement(findById);pst.setInt(1, id);ResultSet rs = pst.executeQuery();if(rs.next()){User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("pwd"));user.setAge(rs.getInt("age"));return user;}DBUtil.close(con);return null;}@Overridepublic void deleteById(int id) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(delete);pstmt.setInt(1, id);pstmt.executeUpdate();con.close();}@Overridepublic void save(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(insert);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.executeUpdate();con.close();}@Overridepublic void updata(User user) throws Exception {// TODO Auto-generated method stubConnection con = DBUtil.getConnection();PreparedStatement pstmt = con.prepareStatement(update);pstmt.setString(1, user.getUsername());pstmt.setString(2, user.getPassword());pstmt.setInt(3, user.getAge());pstmt.setInt(4, user.getId());pstmt.executeUpdate();con.close();}}实体层entity包下面的class文件:package entity;public class User {private int id;private String username;private String password;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}JSP文件:Add.jsp<body><form action="add.action"method="post"><table border="1"align="center"><tr><td>UserName:</td><td><input type="text"name="ername"></td> </tr><tr><td>PassWord:</td><td><input type="password"name="user.password"></td> </tr><tr><td>Age:</td><td><input type="text"name="user.age"></td></tr><tr align="center"><td colspan="2"><input type="submit"value="添加"><a href="list.action">查看用户列表</a></td></tr></table></form><!--<h1>添加</h1><form action="add.action" method="post">用户名:<input type="text" name="ername"><br/>密 码:<input type="password" name="user.pwd"><br/> name="user.pwd"><br/>年 龄:<input type="text" name="user.age"><br/><input type="submit" value="添加"><a href="list.action">查看用户列表</a></form>--></body>Error.jsp<body><h1>系统错误!请稍候重试....!</h1><br></body>List.jsp<body><table border="1"align="center"><tr><th>ID:</th><th>UserName:</th><th>Age:</th><th>相关操作</th></tr><s:iterator value="users"><!-- 遍历 value是集合的对象 --> <tr><td><s:property value="id"/></td><td><s:property value="username"/></td><td><s:property value="age"/></td><td><a href='delete.action?user.id=<s:property value="id"/>'>删除</a><a href='show.action?user.id=<s:property value="id"/>'>查看</a><a href='update_init.action?user.id=<s:property value="id"/>'>修改</a></td></tr></s:iterator><tr align="center"><td colspan="4"><a href="add.jsp">添加</a></td> </tr></table><br/></body>Show.jsp<body>用户名:<s:property value="ername"/><br>密 码:<s:property value="user.password"/><br>年 龄:<s:property value="user.age"/><br><a href="list.action">返回</a></body>Update.jsp<body><h1>用户更新</h1><s:form action="update"theme="simple"method="post"><s:textfield name="user.id"/>用户名:<s:textfield name="ername"/><br/>密 码:<s:password name="user.password" showPassword="true"/><br/>年 龄:<s:textfield name="user.age"/><br/><input type="submit"value="更新"><a href="list.action">查看用户列表</a></s:form></body>。
汉江师范学院普通教育考试试题2015-2016 学年度 2 学期(A卷)一.选择题(单选,共30题,每题2分)1.使用MVC模式设计的Web应用程序所具有的优点不包括()。
A. 可扩展性强B. 代码重复较少C. 可维护性强D. 大大减少代码量2.下列选项中,关于Struts2配置文件,说法正确的是()。
A. 必须放在WEB-INF/classes目录下面B. 必须为struts.xmlC. 配置Action时,必须配置包信息D. 使用<forward>元素配置转发3.下列选项中,关于Struts2的Action,说法正确的是()。
【选两项】A. Struts2会为每一个请求创建一个与之对应的Action实例B. Struts2在请求处理过程中,只有一份Action实例C. Struts2通过属性来封装用户请求参数D. 在Struts2中定义的属性都是用于封装用户请求参数的4.在Struts2中,动态方法调用的格式为()。
A. ActionName_methodName.doB. ActionName!methodName.doC. ActionName_methodName.actionD. ActionName!methodName.action5.下列关于OGNL的说法中,正确的是()。
【选两项】A. ActionContext是OGNL的上下文环境B. StackContext是OGNL的上下文环境C. ValueStack是OGNL的根D. ActionContext是OGNL的根6.假设在某JSP页面中存在“<s:property>”代码,则下列说法中正确的是()。
A. 编译JSP页面时会出现错误B. 编译JSP页面时不会出现错误,但页面不会显示任何内容C. 该代码用于输出位于ValueStack(值栈)栈顶的对象D. 以上说法都不正确7.在MVC设计模式对应的Java组件中,()负责响应和处理客户的请求。
关于struts2中prepare接口实现数据准备之前做过不少的项目,所有的action只实现了一个execute()方法,也用到过Preparable接口,并没注意到它的具体用法。
随着项目的需求的增加,按照以前的方法,每一个功能都需要一个action,这样势必会造成action类的大规模膨胀。
所以决定采取action!method的形式,这样在一个action中可以包含很多方法,减少了action类的数量,也便于维护。
把crud方法放在一个action类中,就必定会涉及到一些数据准备的事情,所以用Preparable接口就再合适不过了,实现这个接口的prepare()方法,这个方法会在action类的所有方法执行前执行,另外我们也可以按照它的规则来写一些其它形式的prepare方法,例如aciton中有一个方法叫input(),那么我们可以实现一个prepareInput方法,这样在input()执行前,会执行prepareInput()方法。
好了,言归正传,我们有这样的一个action:Java代码1.package ht.gisoa.action;2.3.import ht.gisoa.model.Sysconfig;4.import ht.gisoa.service.SysconfigManager;5.6.import java.util.List;7.import java.util.Map;8.9.import javax.servlet.http.HttpServletRequest;10.11.importdParameterJdbcTemplate;12.13.import com.opensymphony.webwork.ServletActionContext;14.importcom.opensymphony.webwork.interceptor.ServletRequestAware;15.import com.opensymphony.webwork.interceptor.SessionAware;16.import com.opensymphony.xwork.ActionSupport;17.import com.opensymphony.xwork.ModelDriven;18.import com.opensymphony.xwork.Preparable;19.import com.thoughtworks.xstream.XStream;20.21.public class SystemConfigAction extends ActionSupport implementsPreparable,SessionAware,ServletRequestAware,ModelDriven{22./**23.*24.*/25.26.private Map session ;27.private HttpServletRequest request;28.29.private NamedParameterJdbcTemplatenamedParameterJdbcTemplate =null;30.31.private Double hignSpeed = 0.0;32.private Double midSpeed = 0.0;33.private Double lowSpeed = 0.0;34.35.private static final long serialVersionUID = 1L;36.private SysconfigManagersysconfigManager = null;37.38.39.private Long id ;40.private Sysconfig entity;41.42.public void setId(Long id) {43.this.id = id;44.}45.46.public String editSpeed() throws Exception{47.Map<String,Sysconfig>configs =sysconfigManager.getSpeedConfig() ;48.ServletActionContext.getRequest().setAttribute("configs",configs);49.return this.SUCCESS;50.}51.52.public String input() throws Exception{53.return "input";54.}55.56.public String list(){57.List<Sysconfig>speedCollection =sysconfigManager.getSpeedList();58.ServletActionContext.getRequest().setAttribute("speedCollection", speedCollection);59.return "list";60.}61.62.public String save() throws Exception{63.sysconfigManager.mergy(entity);64.return "reload";65.}66.67.public String delete() throws Exception{68.sysconfigManager.delete(id);69.return "reload";70.}71.72.public SysconfigManagergetSysconfigManager() {73.return sysconfigManager;74.}75.public void setSysconfigManager(SysconfigManagersysconfigManager){76.this.sysconfigManager = sysconfigManager;77.}78.79.public Double getHignSpeed() {80.return hignSpeed;81.}82.83.public void setHignSpeed(Double hignSpeed) {84.this.hignSpeed = hignSpeed;85.}86.87.public Double getMidSpeed() {88.return midSpeed;89.}90.91.public void setMidSpeed(Double midSpeed) {92.this.midSpeed = midSpeed;93.}94.95.public Double getLowSpeed() {96.return lowSpeed;97.}98.99.public void setLowSpeed(Double lowSpeed) {100.this.lowSpeed = lowSpeed;101.}102.103.public void setSession(Map session) {104.this.session = session;105.}106.107.public void setServletRequest(HttpServletRequest request) { 108.this.request = request;109.}110.111.public void prepare() throws Exception {112.113.}114.115.public void prepareModel() throws Exception {116.if (id==null){117.System.out.println("id=null");118.entity = new Sysconfig();119.entity.setKeyType(1L);120.}else{121.System.out.println("id=="+id);122.entity = sysconfigManager.get(id);123.}124.}125.126.public void prepareInput() throws Exception{127.prepareModel();128.}129.public void prepareSave() throws Exception {130.prepareModel();131.}132.133.public Object getModel() {134.return entity;135.}136.}这里要注意,要在spring中配置该action的作用域为prototype,否则,不同的方法之间会出现数据混乱的情况:Xml代码1.<bean id="systemconfig"2.class="ht.gisoa.action.SystemConfigAction" scope="prototype">3.<property name="sysconfigManager">4.<ref bean="SysconfigManager" />5.</property>6.</bean>sysconfig_input.jsp代码如下:Jsp代码1.<%@ page language="java" pageEncoding="UTF-8"isELIgnored="false"%>2.<%@ tagliburi="/jstl/core_rt" prefix="c"%>3.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN""/TR/html4/loose.dtd">4.<html>5.<head>6.<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">7.8.</head>9.<body>10.<div id="msg">11.${msg}12.</div>13.<c:choose><c:when test="${ param.id == null}">创建</c:when><c:otherwise>修改</c:otherwise></c:choose>设置14.<div id="main">15.<form action="systemconfig!save.action">16.<input type="text" name="model.keyName"value="${model.keyName}"/><br>17.<input type="text" name="model.keyValue"value="${model.keyValue}"/><br>18.<input type="hidden" name="model.id" value="${model.id}"/><br>19.<input type="hidden" name="model.keyType" value="1"/><br>20.<input type="submit" value="修改"/>21.</form>22.</div>23.<c:removevar="msg" scope="session"/>24.</body>25.</html>我们编辑完信息,提交后,会执行action中的save方法,按道理,表单提交后,会将action中的model填充好数据,但是save方法之前又会执行prepareSave 方法,从数据库里获取一次数据,这样不就把之前填充好的数据冲掉了吗?仔细想想也确实是这样的.那么该如何解决这种矛盾呢,立即使出google大法,查了一下关于interceptor 的资料,有这样的一个interceptor:paramsPrepareParamsStack,paramsPrepareParamsStack主要解决了ModelDriven和Preparable的配合问题,从字面上理解来说,这个stack的拦截器调用的顺序为:首先params,然后prepare,接下来modelDriven,最后再params。