Struts2[一]
2019-09-17 / JAVA / 1053 次围观 / 0 次吐槽 /Struts2概述
n Struts2是Apache发行的MVC开源框架。注意:它只是表现层web(MVC)框架。
Struts2的来历
n Struts1:
Ø Struts1也是apache开发的一套mvc的开源框架。在2005年之前非常流行。
Ø 弊端:Struts1的核心控制器就是一个Servlet。随着使用者的增多,弊端开始出现。
n Struts2:
Ø 在long long ago,有一个设计超前的框架XWork,后来推出了XWork1和WebWork2。
Ø Struts2就是apache和OpenSymphony组织合并开发出来。
Ø 里面包含了WebWork2的核心及Struts的一些特性和功能。除此之外,和Struts1没有任何关系了。
Struts的环境搭建
下载Struts2开发包
n http://struts.apache.org
n 下载2.3.33的版本
解压后的目录结构
n 解压zip后的目录结构如下图
apps 官方提供的案例Demo
docs 官方提供的文档
lib 官方提供的jar包,需要用到哪个才导入哪个
src 源码
struts jar包介绍
n 在apps目录中,提供了一个struts2-blank.war 包
n 初始学者在项目集成中,导入lib下的所有包即可
n jar的介绍
struts2-core-2.3.33.jar | Struts核心jar包 |
xwork-core-2.3.33.jar | |
ognl-3.0.19.jar | OGNL表达式 |
log4j-core-2.3.jar | 开源日志 log for java |
log4j-api-2.3.jar | |
asm-3.3.jar | 基于子类的动态代理 |
asm-tree-3.3.jar | 提供其于对象的表现形式 |
asm-commons-3.3.jar | 提供基于事件的表现形式 |
commons-fileupload-1.3.2.jar | 文件上传所需要的包 |
asm-commons-3.3.jar | |
freemarker-2.3.22.jar | 页面 模板框架 |
javassist-3.11.0.GA.jar | 对于字节码的支持,jBoss的一个子项目 |
commons-lang3-3.2.jar | 对java.lang的扩展 |
第一个Struts项目
n 目标:集成Struts需要的东西
步骤:
第一步:创建Web工程
n 创建一个Web工程,名为demo01
第二步:导jar包
n 把struts2-blank.war中的lib下所有的包导入自己创建的工程
第三步:添加配置文件
n 把struts2-blank里classes目录下的struts.xml配置文件拷贝到自己创建工程的src中
n 然后删除struts标签的所有内容,我们一步步讲struts标签内容的知识
第四步:配置struts的过滤器
n 在web.xml中,配置Filter
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
n 配置的目的是用于拦截请求,由Struts的规则去处理请求,而不是用以前的servlet去处理
第五步:Tomcat运行Web工程
n 如果tomcat运行没有报错,就代表配置成功
1.1 Struts 的Action配置讲解
n 目标:配置一个请求的完整流程
第一步:
n 在struts中配置package和action,写如下代码
第二步:
n 写一个HelloAction的类,需要写个sayHello方法
第三步:
n 在WebContent中添加一个success.jsp页面
第四步:
n 浏览器访问下面三个路径
n http://localhost:8080/demo01/hello 【能正常访问】
n http://localhost:8080/demo01/hello.action 【也能正常访问】
n http://localhost:8080/demo01/hello.act 【不能正确访问】
n 因为struts默认是处理.action的请求,或者不带action也可以,其它后缀的都不会拦截,会放行,如jsp
Struts执行流程图
查看Struts的文档
n 在线文件:http://struts.apache.org/core-developers/big-picture
n 离线文档:struts-2.3.33 /docs/docs/home.html
n 打开上面两个连接后,然后查找guides -> bigPictrue执行过程
n 注:User created标识的是以后我们经常要写的
Struts配置文件的加载顺序
加载时机
n struts有很多配置文件,如下面的表格
n 当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了。
加载顺序
顺序 | 配置文件名 | 所在位置 | 说明 |
1 | default.properties | struts2-core-2.3.15.3.jar\org\apache\struts2 | 不能修改 |
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
3 | strtuts-plugin.xml | 在struts2提供的插件jar包中 | 不能修改 |
4 | struts.xml | 我们的应用中 | 可以修改的:推荐 |
5 | struts.properties | 我们的应用中 | 可以修改的 |
6 | web.xml | 我们的应用中 | 可以修改的,可以给过滤器配置参数 |
default.properties的一些默认配置
struts.i18n.encoding=UTF-8 | 国际化 |
struts.action.extension=action,, | 默认访问扩展后缀,可以是action,也可以没有后续 |
struts.devMode = false | 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。 |
struts-defaults中默认的拦截器分组
n 如图,默认的包里有一结果类型,如转发和重定向
n 如图,默认情况下,struts会使用defaultStack的拦截器分组
n struts-defualts中主要的内容
² 结果类型、拦截器分组,默认使用的接替器分组
修改struts的访问后缀
第一种方式:
n 在struts.xml的配置文件中添加 <constant name="struts.action.extension" value="do"></constant>
第二种方式:
n 在src下创建struts.properties
n 添加struts.action.extension=htm
n 注:如果这样配置会覆盖struts.xml的配置
第三种方式:
n 在web.xml中配置
配置struts的开发模式
n 如图,在struts.xml中做如下配置
开发模式的好处:可以显示更多详细的错误信息
Struts配置文件的主要元素讲解
package元素
作用:
n 在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
属性:
name | 包的名称。必须写。且必须唯一。 |
extends | 一般情况下需要继承struts-default包,但不是必须的。 不过如果不继承的话,将无法使用struts2提供的核心功能。 struts-default.xml中定义着struts-default这个包。 而struts-default.xml是在我们的struts.xml加载之前加载。 |
abstract | 把包声明为抽象包,抽象包就是用来被继承的。 只要是没有<action>元素的包,就可以声明为抽象包。 |
namespace | 名称空间。【访问路径=名称空间+动作名称】 |
namespace详解
² namespace的默认取值是一个"",
² 注意:默认值不是/,写自定义的namespace时需要加/
² 访问路径为http://localhost:8080/demo01/user/hello.action
² 注意:需要在访问action前添加红色命令空间
² 如果访问http://localhost:8080/demo01/a/b/user/hello.action 是访问不了
² 但是如果是访问http://localhost:8080/demo01/user/a/b/hello.action 是可以访问的
namespace的查找规则
action 元素
作用:
n 配置动作,处理请求路径
属性:
n name:动作名称
n class:动作类全名。
n method:动作类中的方法名称。默认是public String execute(){}
方法的要求:
1.public的
2.返回值必须是String
3.没有参数
动作类的第一种写法
n 直接在写个Action类,不需要继承任何类,然后在struts.xml中配置
动作类的第二种写法
n 写个Action类实现Action接口,然后实现excute方法
Struts.xml:如果没有配置Method,默认执行Action的excute方法
n Action接口中,有一些静态常量,如下图
n 常量说明
常量变量名 | 对应的值 | 说明 |
SUCCESS | success | 动作方法执行一切OK |
ERROR | error | 动作方法执行时遇到了异常 |
INPUT | input | 回显 |
LOGIN | login | 一般转向登陆页面 |
NONE | none | 不转向任何的视图 |
动作类的第三种写法
n 写个Action类继承ActionSuport类【推荐使用这种方式】
n ActionSupport是实现Action接口的类
默认的动作类
n 在struts-default.xml中定义了默认动作类和方法
n 就是com.opensymphony.xwork2.ActionSupport 这个类
struts.xml:可以在Action中不配置 class 和method,会由默认的动作类来处理,ActionSupport的excute方法返回的就是success
动作访问之通配符
*号通配符优化struts.xml代码
多个*号通配符
动态方法的调用
n 不经常用
访问路径:
http://localhost:8080/demo01/student!addStudent.action
http://localhost:8080/demo01/student!deleteStudent.action
result 元素
作用:
n 为动作指定结果视图
属性:
n name:逻辑视图的名称,对应着动作方法的返回值。默认值是success
n type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher转发。
result中type的取值
n result中type的取值有四种类型
dispatcher | (默认值)使用请求转发,转向一个页面。 |
redirect | 使用重定向,转向一个页面。 |
chain | 转发到另一个相同名称空间的动作 转发到不同名称空间的动作 |
redirectAction | 重定向到另一个相同名称空间的动作 重定向到不同名称空间的动作 |
n type的默认取值是dispatcher
n type属性的取值在struts-default.xml中定义着
redirect重定向
chain 转发到同一个名称空间的动作
redirectAction 重定向到同一个名称空间的动作
chain 转发到不同一个名称空间的动作
redirectAction重定向到不同一个名称空间的动作
result元素中param子元素
n 在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。
n param元素的作用:依赖注入(Dependence Injection)思想
n 我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。
n 而param元素就是将配置的参数,注入到该类中。
n 调用的是对应类的setter方法进行注入的。
自定义结果类型
n 其实结果类型就是一个类,这些类都实现com.opensymphony.xwork2.Result接口。
n 或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport。
n 这些类都有一个doExecute方法,用于执行结果视图。【查看源码各种结果类型的类结构】
n struts的内部实现就是Servlet
² 综上所述自己写一个结果视图
² 例子:输出CAPTCHA图像的结果类型
n CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试)————>简称:验证码。
/** * 验证码结果类 */ public class CAPTCHAResult extends StrutsResultSupport { private int width;//验证码宽度 private int height;//验证码高度 public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } @Override protected void doExecute(String s, ActionInvocation actionInvocation) throws Exception { ValidateCode code = new ValidateCode(width,height,4,8);//创建验证码对象 //获取response HttpServletResponse response = ServletActionContext.getResponse(); //响应客户端 code.write(response.getOutputStream()); } }
<package name="p1" extends="struts-default"> <!-- 声明一个验证码结果类 --> <result-types> <result-type name="captcha" class="com.cheug.web.result.CAPTCHAResult"></result-type> </result-types> <!-- action --> <action name="checkcode"> <result type="captcha"> <param name="width">130</param> <param name="height">30</param> </result> </action> </package>
全局视图和局部视图
n 前面的自定义结果类型的写法是局部视图,其它包是不能访问的
n 全局视图的配置
动作类中的servlet api访问
n 获取servlet 的api方式
² 第一种:通过ServletActionContext获取 【推荐使用】
² 第二种:通过注入方式:先让Action实现两个接口
ServletRequestAware,ServletResponseAware 注入方式原理是struts有拦截器
- 上一篇:Java框架
- 下一篇:Struts2[二]
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.