关于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组件中,()负责响应和处理客户的请求。
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
Struts2(上)一、经典的MVC模式二、Struts1.x对MVC的实现三、Struts1.x的主要组件和作用组件作用ActionServlet 中央控制器Action 分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个ActionStruts-config.xml 配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件Struts标签库和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成四、Struts1.x 开发实例-登录程序见案例。
五、Struts2(WebWork)的MVCStruts2的MVC架构六、Struts2的主要组件组件作用FilterDispatcher 起中央控制器作用的过滤器Action 处于Model层的Action,调用JavaBean实现业务逻辑struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视图技术。
七、Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。
在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。
在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:package mypack;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {erpass = userpass;}@Overridepublic String execute() throws Exception {if ("Mike".equals(username) && "123".equals(userpass)|| "张三".equals(username) && "abc".equals(userpass))return "success";elsereturn "error";}}在src目录下建立Struts2的配置文件struts.xml,内容如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 定义包管理配置的action 继承struts-default.xml中的配置 --><package name="actions" extends="struts-default"><!-- 定义Action(login.action) --><action name="login" class="erAction"><!-- 定义转发路径对应的字符串名 --><result name="success">/Success.jsp</result><result name="error">/Error.jsp</result></action></package></struts>修改web.xml,在其中加入一个过滤器,过滤/*路径。
preparestatement方法prepareStatement方法是Java中用于执行预编译SQL语句的方法,它可以有效地防止SQL注入攻击,提高数据库操作的效率和安全性。
本文将详细介绍prepareStatement方法的使用及其优势。
一、什么是prepareStatement方法prepareStatement方法是Java中Connection接口的一个方法,用于执行预编译SQL语句。
通过该方法,在执行SQL语句之前,数据库系统会对SQL语句进行预处理,编译成一个可执行的查询计划,然后再执行。
这样可以提高数据库操作的效率,并且能够有效地防止SQL注入攻击。
二、prepareStatement方法的使用1. 导入相关的类库在使用prepareStatement方法之前,需要导入相关的类库,具体如下:```javaimport java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;```2. 创建数据库连接需要通过DriverManager类的getConnection方法创建一个数据库连接对象,具体代码如下:```javaConnection conn = DriverManager.getConnection(url, username, password);```其中,url是数据库连接的URL地址,username和password分别是数据库的用户名和密码。
3. 创建预编译SQL语句接下来,需要创建一个PreparedStatement对象,并通过它的prepareStatement方法传入SQL语句,具体代码如下:```javaString sql = "SELECT * FROM students WHERE age > ?"; PreparedStatement stmt = conn.prepareStatement(sql);```在这个例子中,我们使用了一个带有占位符的SQL语句,占位符用问号表示。
Struts 2的基本流程Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。
在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。
2.核心控制器:FilterDispatcherFilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。
如果用户请求以action结尾,该请求将被转入Struts 2框架处理。
Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts 2调用名为login的Action来处理该请求。
Struts 2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。
Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。
而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。
显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。
图3.19显示了这种处理模型。
图3.19 Struts 2的拦截器和Action从图3.19中可以看出,用户实现的Action类仅仅是Struts 2的Action代理的代理目标。
Structs2内建的结果类型Chain:转发请求到下一个actionDispatcher:转发请求给下一个jspFreemarker:用于与FreeMarker的集成Httpheader:把HTTP标头发送回用户Redirect:重定向到另一个URLredirectAction:重定向到另一个actionstream:把一个InputStream流发送给浏览器velocity:用于与Velocity技术的集成xslt:用于与XML和XSLT技术的集成plainText:发送普通文本,如JSP的源代码Preparable:prepare(),prepareXXX(),prepareDoXXX(),拦截器执行3个方法执行的顺序是先寻找prepareXXX(),如果没有该方法,就寻找prepareDoXXX(),最后执行prepare()方法,需要注意的是,prepareXXX()和prepareDoXXX()都存在的话,只会执行prepareXXX()方法,prepare()方法是最后执行的,并且是一定会执行的,prepare()方法用于在你定义的所有的方法之前进行预处理,而prepareXXX()与prepareDoXXX()只能用于XXX方法之前的预处理,可以根据需要灵活选择●Struts2将Result列为一个独立层次,优雅的解决了从Control层转向View层的问题●Result最大职责,就是架起Action到View的桥梁封装跳转逻辑●对Action屏蔽任何Web容器的相关信息,使层次更加清晰●对显示类型进行区分,并封装合理的跳转逻辑准备显示数据●将预先定义好的模板(Template)和需要展示的数据(Model)组织起来,交给模板引擎,才能够正确显示 控制输出行为●提供极大的扩展性,从而保证我们能够定义自己期望的输出类型自定义result:实现Result接口,重写execute()方法声明结果类型:<result-types><result-type name="imagename"class="org.liu.struts.result.PdfResult"></result-type></result-types>在动作中使用自定义结果类型:<result type="imagename"></result>自定义结果类型的参数:从页面上获取输入值:ServletActionContext.getRequest().getParameter(“yourname”);为自定义结果类型添加属性使用<param/>标签设置参数的值与Action的属性进行传递ValueStack valueStack = (ValueStack)invocation.getInvocationContext().getValueStack(); Stringname = (String) valueStack.findValue("name");。
preparedstatement接口的方法PreparedStatement接口是Java中用于执行参数化SQL语句的接口。
它继承了Statement接口,并添加了一些用于设置参数值的方法,以及一些执行SQL语句并获取结果的方法。
PreparedStatement接口的方法具有以下功能:1.参数绑定:PreparedStatement接口可以通过使用占位符(?)来设置参数值。
使用占位符的好处是可以防止SQL注入攻击,并且可以重复使用同一个PreparedStatement对象来执行多个不同的参数化SQL语句。
2.设置参数值:PreparedStatement接口提供了一系列的setXXX()方法,用于设置不同类型的参数值,包括整数、字符串、日期、时间等等。
例如,setInt(int parameterIndex, int x)用于设置int参数的值。
3.获取结果集:PreparedStatement接口提供了executeQuery()方法来执行查询操作,并返回一个结果集。
结果集可以使用ResultSet 接口来获取查询结果的各个字段的值。
4.执行插入、更新或删除操作:PreparedStatement接口还提供了executeUpdate()方法来执行插入、更新或删除操作,并返回一个整数表示受影响的行数。
可以使用getUpdateCount()方法获取受影响的行数。
5.执行批量操作:PreparedStatement接口还提供了addBatch()和executeBatch()方法来执行批量操作。
可以使用addBatch()方法将多个语句添加到批处理中,然后使用executeBatch()方法一次性执行所有的语句。
6.设置参数的类型和长度:PreparedStatement接口的setXXX()方法中,还可以通过指定参数的类型和长度来设置参数的值。
例如,setString(int parameterIndex, String x, int length)用于设置字符串参数的值和长度。
关于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。