文档库 最新最全的文档下载
当前位置:文档库 › Struts2入门

Struts2入门

Struts2入门

Struts2与struts1相比,是一个全新的MVC框架。

FilterDispatcher,将接收所有请求,并根据ActionMapper(请参考:docs\actionmapper.html)所提供的信息,决定Action是否应该被调用或哪些方法将被调用(如判断其URL扩展名是否符合要求,URL是否符合某些特定的语法规则(如foo!bar.action将调用foo类的bar方法)等,请参考相关的文档),当然,对于ActionMapper而言,由于它的判断需要依赖于struts2的配置,所以,它也要用到ConfigurationManager来获得配置信息。

接下来,针对每个Action类,将创建ActionProxy对象,它的创建依赖于ConfigurationManager (即配置文件)。

接下来执行ActionProxy对象的execute方法,如果给Action配置了一系列拦截器,那么这个Action的代理类将逐个执行这些拦截器。

当ActionProxy调用Action的方法,执行完之后,它将获得相关的Result对象,并调用Result.的execute方法来产生response对象。

Struts2的请求过程

包依赖

基础包:

https://www.wendangku.net/doc/0f8032306.html,mons-logging-1.1.jar

2.freemarker-2.

3.8.jar

3.ognl-2.6.11.jar

4.struts2-core-2.0.8.jar

5.xwork-2.0.3.jar

入门级例子

1、首先拷贝需要的基础依赖包(去除重复的jar包,保留高版本的)

ActionSupport类)。当然,你需要返回一个String类型的值,这个值代表的意思是,你的下一步要到哪里去。

4、在类路径下,添加struts.xml配置文件,这个配置文件,是对Action的配置:

6、打开IE浏览器,在地址栏输入:

至此,第一个struts2程序完成了。下面,是关于这个程序的问题的解答,以及进一步的讨论:

为什么需要输入.action结尾的URL地址?而不是.do?

Struts2在默认情况下,会将.action结尾的请求进行处理。我们可以在struts.xml配置文件中,

指定可以使用的扩展名:

比如:

这将使得struts2,对于所有以.action或.do或.webwork扩展名结尾的请求均进行处理!当然,它也可以在web.xml中或其它地方进行配置,struts2提供了非常灵活的方式,请【参考相应的文档(docs\constant-configuration.html)】或参考struts2-core-2.0.8.jar\org\apache\struts2下面的default.properties文件(这个文件在struts的核心jar包中)。

Struts2都有哪些配置文件?

Struts.xml是主要的配置文件,当然通过include标签可以将它拆分。比如,在struts.xml加入:

即可添加一个example.xml文件,这个文件的配置与struts.xml文件的配置一致。往往大型应用中会按模块来划分配置文件。

另外还可以配置一些配置文件,请【参考docs\configuration-files.html】

通过使用annotation(JDK5的新特性),也可以完全取消这些配置文件。达到零配置文件的目的。也请参考相关的文档说明。

Struts2配置

【请参考:docs\configuration-elements.html】

相关概念:

Package:用来组织Action及其一系列配置的方式

Namespace: 页面访问的起始路径

Action:处理请求

Result: 结果转向

拦截器:将要使用哪些拦截器

Include: 可以将文件进行拆分,即通过include标签将一个配置文件包含进另外一个配置文件中

Struts2 的Action类?

Struts2的ACTION类可以是普通的POJO对象。方法只要返回字符串类型即可。这些字符串,正代表了下一步的转向。这些Action类,每次请求都会创建一个新的对象。

Struts2的Action返回参数(result)?

用一个字符串代表result,然后可以定义一个视图(比如某个JSP页面),与之匹配。

定义在标签内部的result是局部result,也可以定义全局result:

默认的result是JSP视图,我们可以通过指定result的类型来指定其使用不同的视图技术,

另外还有各种result 类型。

【请参考:docs\result-types.html】

如何从浏览器向ACTION传递参数?

在Action类中定义属性,并提供getters/setters方法即可。

更常用的做法是在action中持有要取参数的实体类的引用,action实现ModelDriven接口并实现其getModel()方法(如果不实现接口和方法则需要在jsp中用对象导航到属性)

如何将参数从action传递到JSP?

在JSP中,使用:

<%@ taglib prefix="s" uri="/struts-tags" %>

引入struts2的taglib

调用:这样的标签,可以把值,从Action的属性中取出。

或者使用ActionContext.getContext().put()方法来传值。

或通过ServletActionContext.getRequest()/getSession()等方法往request/session中传值,在页面上可以通过:

这样的方式来取值,【请参考:docs\ognl.html】

Struts2中文参数传递

可以在xeb。Xml中添加filter过滤,也可以在struts.xml中添加

传递参数的内部机制是什么?(V alueStack)

概述

当请求到达ActionProxy进行处理之前,它会将界面传递过来的参数,经过转换之后,设置到Action对象中。这种转换是通过OGNL进行的。

OGNL(Object Graph Navigation Language)是一种强大的对象导航语言,通过OGNL可以用一种非常简易的方式来给对象设值或从对象取值。而Struts2正是依赖于OGNL的这种设值和取值机制,来将页面数据转换为相应的类型并设置到Action对象中;或者从页面中读取数据的。

Struts2的OgnlV alueStack,正是对Ognl的封装。V alueStack中会包含有当前环境中的各种对象信息。我们也可以通过调用ActionContext.getContext().put()方法,来往这个V alueStack中添加对象。

Struts2会将这个V alueStack放入request scope中,并取值为:struts.valueStack

OGNL

●context

context是一个Map结构,可以自定义变量,并在ognl中的表达式中引用。使用#开头来引用这些2222222222222222222变量

●root

根对象,对于根对象,无需使用#开头来访问其属性值

根据实际例子来讲解OGNL的使用

ValueStack

Struts2中的类型转换器的使用

类型转换器的定义:

- 继承StrutsTypeConverter即可

局部类型转换:即针对某个Action的属性定义转换器

1、需按某种规则定义注册文件(类名-conversion.properties),并放置在与Action一个包下面

(参考V erySimpleAction-conversion.properties)

2、文件内容的定义是:属性名=转换器类名

全局类型转换:即针对整个系统中同样类型的属性定义转换器

1、需在类路径根目录下定义xwork-conversion.properties文件

2、在文件中用这样的格式定义:属性类型的全路径类名=转换器全路径类名

参考(xwork-conversion.properties)

与Spring如何集成?

1、将struts2-spring-plugin-2.0.8.jar加入类路径

2、在配置文件中,添加属性:

3、即可以在spring中定义Action类,同时把struts2的配置文件中的class属性改为spring 配置中的id值即可

如何处理异常?

通过类似如下配置可以定义出现一个异常的时候,应该转向什么页面来呈现:

当出现SystemException异常之后,将转向exception.jsp页面,在exception.jsp页面上,可以这样写:

【请参考:docs\exception-configuration.html】

Struts2标签库

主题,模板,标签

主题是模板的集合

默认情况下,使用在template目录下的xhtml(主题名称)目录内的tag标签(这些模板是freemarker编写的模板文件)

在不改动任何配置的前提下,我们可以在类路径中添加template目录,并且把xhtml目录拷贝到template目录下,这样,我们可以随意修改这些模板文件,直到符合我们的需要。Struts2将自动使用这些标签模板文件。

【请参考:docs\themes-and-templates.html】

### Standard UI theme

### Change this to reflect which path should be used for JSP control tag templates by default

struts.ui.theme=xhtml

struts.ui.templateDir=template

#sets the default template type. Either ftl, vm, or jsp

struts.ui.templateSuffix=ftl

Struts2编程中的一些常见陷阱:

在使用modelDriven接口的时候,更新对象时要注意

因为ModelDriven把对象压入了ConpoundRoot,使它成为root 而我们在更新时需要首先加载对象并显示时,不能直接覆盖Action中的Person,因为这样不会更新ConpoundRoot 中的Person,页面中取出来的还是原来的Person,所以需要拷贝属性到person中,也可以在页面中进行对象+. 进行导航。(注意:在使用类型转换器的时候,如果需要转换的属性是该对象的属性需要将其配置文件定义为该实体类的名字命名,然后把配置文件和实体类放在一期)

Struts2拦截器的定义和使用方法

参看项目:

Struts2与Spring的集成

在struts2中集成spring的支持【即将Action对象的创建交给spring来完成】:

1、将struts2-spring-plugin-2.0.8.jar和spring.jar加入类路径

2、在配置文件中,添加属性:

3、即可以在spring中定义Action类,同时把struts2的配置文件中的class属性改为spring 配置中的id值即可

- 【注意】即使集成了spring,如果我们在定义Action的class属性时,仍然定义的是Action的全路径

类名,而不是定义在spring配置文件中的id名称时,Action对象的创建仍然是由struts 来完成。

在struts2中集成sitemesh布局框架的方法:1、添加依赖包:

struts2-sitemesh-plugin-2.0.8.jar

sitemesh-2.3.jar

2、在web.xml中添加sitemesh的过滤器,

这个过滤器应该添加到struts2过滤器的前面

- com.opensymphony.module.sitemesh.filter.PageFilter : 使用JSP作为布局页面

- org.apache.struts2.sitemesh.FreeMarkerPageFilter : 使用Freemarker作为布局页面

3、定义装饰器页面

- 如果用JSP作为装饰器,那么需要引入sitemesh的taglib,用标签来定义装饰器【参考common/navigation.jsp】

4、添加sitemesh的配置文件

- 在WEB-INF目录下添加decorators.xml文件定义装饰器(即给装饰器起一个名字以便引用)

5、应用装饰器

- 在想要装饰的页面头部加上类似这样的内容即可

content的取值就是想要应用的装饰器的名称

【注意】在使用FreemarkerPageFilter的时候,被装饰的页面不能直接访问,而是要通过Action 来转向这些页面

- 也可以通过自己扩展FreemarkerPageFilter来修正这个问题【Google搜索】

【注意】在Struts2里面使用sitemesh的时候,因为有可能在sitemesh的装饰器页面中需要访问struts2的ActionContext

中相关的变量信息,但是struts2在默认情况下,会在它的Filter中把这些变量信息清空,为了延迟这种情况

操作,需要在sitemesh的外面再配置一个ActionContextCleanUp过滤器

struts-cleanup

org.apache.struts2.dispatcher.ActionContextCleanUp

【注意】在使用sitemesh的时候,有一些小BUG,即对于那些未被装饰的页面,加载速度比较慢,因此,可以在

sitemesh的配置文件中加上一个装饰器,装饰其它所有尚未装饰的页面【请参考decorators.xml】

/*

受控目录

在项目webroot下面,以struts开头的路径(struts*),是受到struts2控制的,你无法通过页面直接访问放到这些目录下面的JSP页面(但是在后台配置result的时候,可以使用)。

如:

/struts/test/index.jsp

/struts/index.jsp

struts2 strus.xml中result类型及含义

struts2strus.xml中result类型及含义 一个提交到服务器的处理通常可以分为两个阶段,第一个阶段查询服务器状态(查询或者更新数据库),第二个阶段选择一个合适的结果页面其返回给用户(这里要讲的Result的内容)。 Struts2提供了对不同种类返回结果的支持,常见的有JSP,FreeMarker,Velocity等。 Struts2支持的不同类型的返回结果为: 名字说明 Chain Result用来处理Action链 Dispatcher Result用来转向页面,通常处理JSP FreeMarker Result处理FreeMarker模板 HttpHeader Result用来控制特殊的Http行为 Redirect Result重定向到一个URL Redirect Action Result重定向到一个Action Stream Result向浏览器发送InputSream对象,通常用来处 理文件下载 Velocity Result处理Velocity模板 XLS Result处理XML/XLST模板 PlainText Result显示原始文件内容,例如文件源代码 结合Tile使用 S2PLUGINS:Tiles Result 另外第三方的Result类型还包括JasperReports Plugin,专门用来处理JasperReport类型的报表输出。 在struts-default.xml文件中已经有了对于所有类型Result的定义:

Java多方式实现文件上传

在Struts 2中实现文件上传 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题,所以今天我们就来讨论一下这个问题。 实现原理 Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。 具体实现 前段时间Apache发布了Struts 2.0.6 GA,所以本文的实现是以该版本的Struts 作为框架的。以下是例子所依赖类包的列表: 清单1 依赖类包的列表 首先,创建文件上传页面FileUpload.jsp,内容如下: <% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncodi ng = " utf-8 " %> <% @ taglib prefix = " s " uri = " /struts-tags " %> Struts 2 File Upload

struts2复习题(含答案)

Struts2复习题 1.以下属于struts2的控制器组件是: 2.以下属于struts2的体系结构的是:(多选) 控制器组件配置文件 3.以下属于struts2配置文件中的配置元素是:(多选) A. B. C. D. 4.关于struts1和struts2对比的说法正确的是: 要求Action类继承struts1框架中的Action父类,struts2中则不一定需要继承,可以是POJO 类 中的Action不是线程安全的,而struts2中的Action是线程安全的 和struts2中都使用ActionForm对象封装用户的请求数据 使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值 5.以下关于ValueStack说法正确的是:(多选) A.每个Action对象实例拥有一个ValueStack对象 B.每个Action对象实例拥有多个ValueStack对象 中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中 会在请求开始时被创建,请求结束时消亡 6.关于struts2配置文件说法正确的是: A.必须在WEB-INF/classes目录下 B.名字必须为 C.配置Action时,必须配置包信息 D.使用元素配置转发 7.在struts2配置中用()元素来配置常量: A. B. C. D. 8.关于struts2包的说法正确的是: 框架使用包来管理常量 框架定义包时必须指定name属性 框架中配置包时,必须继承自struts-default包,否则会报错 框架中使用包来管理Action 9.struts2中获取Servlet API的方法正确的是:(多选) A.使用ActionContext对象以解耦合的方法访问Servlet API B.使用ServletActionContext对象以解耦合的方式访问Servlet API C.使用ActionContext对象以耦合的方式访问Servlet API D.使用ServletActionContext对象以耦合的方式访问Servlet API 10.struts2动态调用的格式为: ! 11.如果要实现struts2的数据校验功能 A.普通Action类可以实现 B.继承自Action接口可以实现 C.继承自ActionSupport类可以实现 D.继承自ActionValidate类可以实现

Struts2标签使用

Struts2标签使用 (1): ---- 文本输入框 使用: (2): ----- 文本域输入框 使用: (3): ----- 密码输入框 使用: 前三个基本都是一样的。如果是要显示值的话可以这样:value = “实体Bean。Get***()”。 (4): ---- 单选按钮 使用:其中list 属性是必须要有的。 <1>:第一种方式:list = “#{‘male’:’男’,’female’:’女’}”

<2>:第二中方式:list = “#request/session.list”。 ---- 与action 结合起来了。 如果要默认选中的话后面加上value = “”.也可以通过javascript 的方式来默认选中。 (5): --- url连接 --- 超链接 这两个标签一般结合起来来使用。 使用: (6): --- 获取相应form的值 使用: <1>:

2016年最新版JavaEE学科课程大纲 黑马程序员官网

2016年最新版JavaEE学科课程大纲黑马程序员官网 2016年最新版JavaEE学科课程大纲 一、JavaWeb部分 第一阶段:JavaWEB 部分一之WEB前端技术 1、Html了解HTML语言,HTML语言背景知识,掌握HTML 的整体结构、文件标签、排版标签、块标签、字体标签、列表标签、图形标签、超链接标签、表格标签、表单标签(form 标签、input标签、select标签等)、分区标签、头标签。(1)CSSCSS介绍、CSS导入方式(内部样式表、内联样式表、外部样式表)、五大CSS选择器(ID选择器、类选择器、元素选择器、属性选择器、伪类等)、样式属性介绍。(2)JavaScript基础JavaScript编程,JavaScript语法、数据类型、运算符、表达式、流程控制,JavaScript内部对象、数组、字符串、日期时间、数学函数、正则表达式,JavaScript函数、自定义函数、全局函数,BOM介绍、window 对象、location对象、history对象使用。 DHTML编程,理解DOM树,DOM对象,常用DOM对象的属性、方法和事件,编写事件处理程序、使用DOM操作HTML文档、遍历文档树上的节点、搜索文档中特定的元素、修改文档内容、往文档添加新内容、使用DOM操作 XML文档。

(3)JQuery基础认识JQuery、选择器介绍、css选择器、jQuery选择器及其优势势、基本选择器、层次选择器、过滤选择器、表单选择器、选择器练习小案例等;JQuery操作DOM:DOM分类、查找元素/属性节点、创造元素/属性/文本节点、插入节点、删除节点、复制节点、替换节点、包裹节点、属性操作、样式操作、遍历节点、CSS-DOM操作; 动画和事件:jQuery中的事件、加载DOM、事件绑定、合成事件、事件冒泡、事件对象的属性、移除按钮上注册的事件、模拟操作、JQuery中的动画。 (4)BootStrap响应式页面的的开发与设计,强大的栅格布局,内置的CSS类库,JS插件,快速布局商城页面。第二阶段:JavaWEB部分二之服务器端技术 (1)Mysql及JDBC数据库使用,SQL语句介绍、数据库增删改操作DDL语句使用、表增删改操作DML语句使用、表查询操作DQL语句使用、以及查询语句条件、排序、聚合、分组操作。JDBC介绍、驱动的原理及使用、JDBC核心使用、DriverManager、Connection、Statement、ResultSet 详细使用,JDBC的CURD操作、防止SQL注入及PrepareStatement使用。连接池的介绍,自定义连接池。常用的开源连接池的DBCP 和C3P0的介绍和使用,JDBC 的工具类DBUtils的使用。 (2)JavaWEB 核心技术课程

第七章 struts2的上传下载

《开始Struts 2》 第七章 struts2的上传下载 序 文件上传是Web应用经常需要面对的问题,在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data”属性,则提交表单时不再以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParamete:方法无法正常获取请求参数的值,我们可以通过二进制流来获取请求内容—通过这种方式,就可以取得希望上传文件的内容,从而实现文件的上传。

Struts 2 未提供自己的请求解析器,也就是说,Struts 2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts 2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。 在Struts 2的struts.properties配置文件中,我们看到了下面的配置代码,它们主要用于配置Struts 2上传文件时的卜传解析器。 #指定使用cos的文件上传解析器 # struts.multipart .parser=cos #指定使用Pell的文件上传解析器 #struts.multipart.parser=pell #Struts 2默认使用Jakarta的Common-FileUpload的文件上传解析器 struts.multpart .parser=jakarta Struts 2默认使用的是Jakarta的Common-FileUpload的文件上传框架,要使用Struts 2的文件上传功能,则需要在Web应用中增加两个commons-io-1.3. l .ja:和commons-fileupload-1.2. jar 文件上传 例子: 上传页面 上传的action private String fileDesc;//和前台的是同一个 private File file;//这是IO的File,回顾下strust1.x的FormFile //这两个字段是被注入进来的,前台页面并没有这两个表单域 private String fileFileName; private String fileContentType; /** * 获得保存的路径 */ private String getSaveDir(){ return ServletActionContext.getServletContext().getRealPath("/userDatas"); } @Override public String execute() throws Exception {

java基础试题1

一 1,对Struts2中的Action类描述不正确的是 ,Action类是一个特殊的类,它必须继承ActionSupport类 它可以是一个普通的类 为了简化程序员的编码过程,可以继承ActionSupport类 通过在struts.xml文件或注解来实现其Action的特殊性 ,0 2,在web.xml文件中,welcome-file元素的作用是? ,设定错误处理文件 设定欢迎文件 设定帮助文件 设定Web应用程序缺省的访问资源 ,3 3,JFinal中,@ClearInterceptor默认的作用是? ,清除所有的拦截器 清除上一级的拦截器 清除当前级别的拦截器 清除下一级别的拦截器 ,1 4,在JFinal中,使用下面哪个方法来配置对数据库的访问? ,configConstant configRoute configPlugin configInterceptor ,2 5,JFinal框架通常用来开发什么类型的程序? ,Java Web应用程序Java Application Android App IOS App ,0 6,什么叫抽象类 ,涉及到重载的类。 具有抽象函数的类。 涉及到多态性的类。 涉及到的类。,1 7,在JFinal中,通过下面哪个方法可以实现数据库表和Model的映射关系,addMapping add render invoke,0 8,在Struts2中,通过下面哪个注解可以用来配置action? ,@Package @Action@Before @Namespace ,1 9,在JFinal中配置了一个路由规则routes.add(""/hello"", HelloController.class); 下面的url是访问控制器类中的哪个方法? http://localhost:8080/hello/v0 ,HelloController.v0() HelloController.list() HelloController.save() HelloController.index() ,3 10,不属于Action 接口中定义的字符串常量的是? ,SUCCESS FAILURE ERROR INPUT,1

SSH实现上传下载

Struts Spring Hibernate实现上传下载 https://www.wendangku.net/doc/0f8032306.html, 2005年12月21日 10:06 天极yesky 引言 文件的上传和下载在J2EE编程已经是一个非常古老的话题了,也许您马上就能掰着指头数出好几个著名的大件:如SmartUpload、Apache的FileUpload。但如果您的项目是构建在Struts+Spring+Hibernate(以下称SSH)框架上的,这些大件就显得笨重而沧桑了,SSH提供了一个简捷方便的文件上传下载的方案,我们只需要通过一些配置并辅以少量的代码就可以完好解决这个问题了。 本文将围绕SSH文件上传下载的主题,向您详细讲述如何开发基于SSH的Web程序。SSH 各框架的均为当前最新版本: ·Struts 1.2 ·Spring 1.2.5 ·Hibernate 3.0 本文选用的数据库为Oracle 9i,当然你可以在不改动代码的情况下,通过配置文件的调整将其移植到任何具有Blob字段类型的数据库上,如MySQL,SQLServer等。 总体实现 上传文件保存到T_FILE表中,T_FILE表结构如下: 图 1 T_FILE表结构 其中:

·FILE_ID:文件ID,32个字符,用Hibernate的uuid.hex算法生成。 ·FILE_NAME:文件名。 ·FILE_CONTENT:文件内容,对应Oracle的Blob类型。 ·REM ARK:文件备注。 文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle 数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的差别,从而撤除程序在多数据库移植上的樊篱。 1.首先数据表中的Blob字段在Java领域对象中声明为byte[]类型,而非java.sql.Blob 类型。 2.数据表Blob字段在Hibernate持久化映射文件中的type为 org.springframework.orm.hibernate3.support.BlobByteArrayType,即Spring所提供的用户自定义的类型,而非java.sql.Blob。 3.在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts 通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 综上所述,我们可以通过图 2,描绘出SSH处理文件上传的方案:

struts2多文件上传下载

struts2多文件上传下载 文件上传: 1,upload.jsp如下: <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> My JSP 'upload.jsp' starting page