15.
22.
关于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.import
https://www.doczj.com/doc/5615056639.html,dParameterJdbcTemp
late;
12.
13.import com.opensymphony.webwork.ServletActionContext;
14.import
com.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 implements
Preparable,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
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
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. 2.class="ht.gisoa.action.SystemConfigAction" scope="prototype"> 3. 5. 6.
sysconfig_input.jsp代码如下:
Jsp代码
1.<%@ page language="java" pageEncoding="UTF-8"
isELIgnored="false"%>
2.<%@ tagliburi="https://www.doczj.com/doc/5615056639.html,/jstl/core_rt" prefix="c"%>
3.
"https://www.doczj.com/doc/5615056639.html,/TR/html4/loose.dtd">
4.
5.
6.
7.
8.
9.
10.
11.${msg}
12.
13.
14.
15.
22.
23.
24.
25.
我们编辑完信息,提交后,会执行action中的save方法,按道理,表单提交后,会将action中的model填充好数据,但是save方法之前又会执行prepareSave 方法,从数据库里获取一次数据,这样不就把之前填充好的数据冲掉了吗?仔细想想也确实是这样的.
那么该如何解决这种矛盾呢,立即使出google大法,查了一下关于interceptor 的资料,有这样的一个interceptor:paramsPrepareParamsStack,paramsPrepareParamsStack主要解决了ModelDriven和Preparable的配合问题,从字面上理解来说,这个stack的拦截器调用的顺序为:首先params,然后
prepare,接下来modelDriven,最后再params。Struts 2.0的设计上要求modelDriven在params之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。流程如下:
1. params拦截器首先给action中的相关参数赋值,如id
2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
4. params拦截器再将参数赋值给model对象
5. action的业务逻辑执行
我的xwork.xml中相关配置如下:
Xml代码
1.
2.
3.syscfg_speed_list.jsp
4.
5.
6.systemconfig!list.action
7.
8.
9.syscfg_speed_input.jsp
10.
11.
12.
13.
通过paramsPrepareParamsStack可以让流程更明确,代码更简洁,也更利于大家的交流。
--------------------------------------装--------------------------------------订------------------------------线---------------------------------------- **学院课程考试试卷 课程名称:《使用Struts2开发基于MVC设计模式的企业级应用》(A)卷 年级:班级: 姓名:_______________ 学号:_________________ 考试(考查) 闭卷 选择题(每题2分,共计100分) 1.在控制器类中一般需要添加相应属性的( A )和(C )。(选两项) A.setter方法 B.as方法 C.getter方法 D.is方法 2.业务控制器需要在( B )配置文件中进行配置 A.web.xml B.struts.xml C.struts2.xml D.webwork.xml 3.不属于Struts 2表单标签库的是( D )。 A.
2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·
VC常用数据类型使用转换详解 CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。 而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。 1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的. 2.C表示const 3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char. 为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。 LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。 然后为了实现两种编码的通用,提出了TCHAR的定义: 如果定义_UNICODE,声明如下: typedef wchar_t TCHAR; 如果没有定义_UNICODE,则声明如下: typedef char TCHAR; LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。 CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
基本概念 ?操作系统中heap 和stack 的区别 ?什么是基于注解的切面实现 ?什么是对象/关系映射集成模块 ?什么是Java 的反射机制 ?什么是ACID ?BS与CS的联系与区别 ?Cookie 和Session的区别 ?fail-fast 与fail-safe 机制有什么区别 ?get 和post请求的区别 ?Interface 与abstract 类的区别 ?IOC的优点是什么 ?IO 和NIO的区别,NIO优点 ?Java 8 / Java 7 为我们提供了什么新功能 ?什么是竞态条件?举个例子说明。 ?JRE、JDK、JVM 及JIT 之间有什么不同 ?MVC的各个部分都有那些技术来实现?如何实现? ?RPC 通信和RMI 区别 ?什么是Web Service(Web服务) ?JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。?WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。 ?一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制
?简单说说你了解的类加载器。是否实现过类加载器 ?解释一下什么叫AOP(面向切面编程) ?请简述Servlet 的生命周期及其相关的方法 ?请简述一下Ajax 的原理及实现步骤 ?简单描述Struts的主要功能 ?什么是N 层架构 ?什么是CORBA?用途是什么 ?什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言” ?什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配 ?什么是懒加载(Lazy Loading) ?什么是尾递归,为什么需要尾递归 ?什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)关键字 finalize ?什么是finalize()方法 1.finalize()方法什么时候被调用 2.析构函数(finalization)的目的是什么 3.final 和finalize 的区别 4.final ?final关键字有哪些用法 1.final 与static 关键字可以用于哪里?它们的作用是什么 2.final, finally, finalize的区别
Struts 2作业 1.简述什么是MVC? 答:MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应用程序一般包括以下几块内容:·控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。·模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。·视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客户端请求的响应结果的模板文件 2.Struts 2以(WebWork)为核心,采用(拦截器)的机制来处理用户的 请求。 3.简述一个请求在Struts 2框架中的处理流程,请按自己对框架的理解叙述。答:1-用户提交自己的请求;2-由web.xml拦截,转发到action进行处理;3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面。 4.不属于Action接口中定义的字符串常量是( B )? A)SUCCESS B)FAILURE C)ERROR D)INPUT 5.资源文件的后缀名为(D)? A)txt B)doc C)property D)properties 6.在JSP页面中可以通过Struts 2提供的(D)标签来输出国际化信息。 A)
Matlab中有15种基本数据类型,主要是整型、浮点、逻辑、字符、日期和时间、结构数组、单元格数组以及函数句柄等。 1、整型:(int8;uint8;int16;uint16;int32;uint32;int64;uint64)通过intmax(class)和intmin(class) 函数返回该类整型的最大值和最小值,例如intmax(‘int8’)=127; 2、浮点:(single;double) 浮点数:REALMAX('double')和REALMAX('single')分别返回双精度浮点和单精度浮点的最大值,REALMIN('double')和REALMIN ('single')分别返回双精度浮点和单精度浮点的最小值。 3、逻辑:(logical) Logical:下例是逻辑索引在矩阵操作中的应用,将5*5矩阵中大于0.5的元素设定为0: A = rand(5); A(A>0.5)=0; 4、字符:(char) Matlab中的输入字符需使用单引号。字符串存储为字符数组,每个元素占用一个ASCII字符。如日期字符:DateString=’9/16/2001’ 实际上是一个1行9列向量。构成矩阵或向量的行字符串长度必须相同。可以使用char函数构建字符数组,使用strcat函数连接字符。 例如,命令name = ['abc' ; 'abcd'] 将触发错误警告,因为两个字符串的长度不等,此时可以通过空字符凑齐如:name = ['abc ' ; 'abcd'],更简单的办法是使用char函数:char(‘abc’,’abcd’),Matlab自动填充空字符以使长度相等,因此字符串矩阵的列纬总是等于最长字符串的字符数. 例如size(char(‘abc’,’abcd’))返回结果[2,4],即字符串’abc’实际存在的是’abc ’,此时如需提取矩阵中的某一字符元素,需要使用deblank函数移除空格如name =char(‘abc’,’abcd’); deblank(name(1,:))。 此外,Matlab同时提供一种更灵活的单元格数组方法,使用函数cellstr可以将字符串数组转换为单元格数组: data= char(‘abc’,’abcd’) length(data(1,:)) ->? 4 cdata=cellstr(data) length(cdata{1}) ->?3 常用的字符操作函数 blanks(n) 返回n个空字符 deblank(s) 移除字符串尾部包含的空字符 (string) 将字符串作为命令执行 findstr(s1,s2) 搜索字符串 ischar(s) 判断是否字符串 isletter(s) 判断是否字母 lower(s) 转换小写 upper(s) 转换大写 strcmp(s1,s2) 比较字符串是否相同 strncmp(s1,s2,n) 比较字符串中的前n个字符是否相同 strrep(s1,s2,s3) 将s1中的字符s2替换为s3 5、日期和时间 Matlab提供三种日期格式:日期字符串如’1996-10-02’,日期序列数如729300(0000年1月1日为1)以及日期向量如1996 10 2 0 0 0,依次为年月日时分秒。 常用的日期操作函数
类型转换中的异常处理及资源国际化
Struts2的类型转换异常处理 在视图页面中,用户的输入是很复杂的,偶然的输入错误或者恶意输入都会导致程序异常。因此,必须对用户输入的数据进行校验。例如,年龄信息必须是整数,一但用户输入了一个ABC,这时就需要进行数据类型校验。 Struts 2.0提供了类型转换异常处理机制,使用的是一个名字为conversionError的拦截器,这个拦截器被注册在默认的拦截器栈中。如果Struts 2.0在类型转换过程中出现问题,这个拦截器就会进行拦截,并将异常信息封装成一个fieldError对象在视图页面上显示出来。 整个过程无须我们参与,Struts 2.0的类型转换器和conversionError拦截器会自动实现。 (一)简单类型转换异常 主要是处理一些String、int、Date等数据类型之间的转换异常。 见例子“convError”,一个用户注册的功能: (1)Action的代码: package conv; import com.opensymphony.xwork2.ActionSupport; public class userAction extends ActionSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { https://www.doczj.com/doc/5615056639.html, = name; } public int getAge() { return age; }
一、选择题(每题1分,共35分) 1. Struts2主要核心功能是由()实现 a) 过滤器b) 拦截器c) 类型转换器d) 配置文件 2. Struts中的ActionServlet属于MVC模式() a) 视图b) 模型c) 控制器d) 业务层 3. Struts2框架由()和()框架发展而来的【选择二项】 a) Hibernateb) Strutsc) Springd) WebWork 4. Struts2以(B)为核心,采用()的机制处理用户请求 a) Struts b) WebWork c) 拦截器 d) jar包 5. struts2中,不属于Action接口中定义的字符串常量的是() a) SUCCESS b) FAILURE c) ERROR d) INPUT 6. struts2在控制器类中一般需要添加相应属性的()和()【选择二项】 a) setter方法 b) as方法 c) getter方法 d) is方法 7. struts2控制器需要在()配置文件中进行配置 a) web.xml b) struts.xml c) application.porperties d) webwork.xml 8. 不属于struts2标签库的是() a)
Struts2中数据标签使用示例 S truts2提供了大量丰富的标签供使用,它不再像S truts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对S truts2中数据标签的学习,来对S truts2中标签的学习起到一个抛砖引玉的作用。 文中将介绍Action标签、Bean标签、Data标签、Include标签、P aram标签、Set标签、T ext标签、P roperty 标签等标签。 代码下载:https://www.doczj.com/doc/5615056639.html,/y1ps2Mjpc3NiLKuetMOpCsZOOypD6KSdo8-46Zy2wpoMcABeo4vOC NJXtWDEO93-TXgZogwAF YxSOni5BEG2EoN65OFwHdG71v-/St ruts2DataTags.rar?download 一、