Struts2
Posted 蓝天的永恒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2相关的知识,希望对你有一定的参考价值。
Struts2的相关配置文件
* default.properties -- 在org/apache/struts2/目录下,代表的是配置的是Struts2的常量的值
* struts-default.xml -- 在Struts2的核心包下,代表的是Struts2核心功能的配置(Bean、拦截器、结果类型等)
* struts-plugin.xml -- 配置插件的信息
* struts.xml -- 重点中的重点配置,代表WEB应用的默认配置,可以配置常量,基本就配置它就可以
* struts.properties -- 该文件是Struts的默认配置文件 (可以配置常量 )
* web.xml -- 配置前端控制器(可以配置常量)
注意:后加载的配置文件会覆盖掉之前加载的配置文件(在这些配置文件中可以配置常量)
Struts2核心配置文件Struts2.xml的配置入门
<package>标签
如果要配置<Action>的标签,那么必须要先配置<package>标签,代表的包的概念。
包含的属性
name 包的名称,要求是唯一的,管理action配置。
extends 继承,可以继承其他的包,只要继承了,那么该包就包含了其他包的功能,一般都是继承struts-default
namespace 名称空间,一般与<action>标签中的name属性共同决定访问路径,常见的配置如下:
* namespace="" -- 默认的名称空间(访问的方式和namespace="/"是一样的)
* namespace="/" -- 根名称空间
* namespace="/aaa" -- 带有名称的名称空间
* abstract -- 抽象的。这个属性基本很少使用,值如果是true,那么编写的包是被继承的。
<action>标签
代表配置action类,包含的属性
name 和<package>标签的namespace属性一起来决定访问路径的。
class 配置Action类的全路径(默认值是ActionSupport类)
method Action类中执行的方法,如果不指定,默认值是execute
<result>标签
action类中方法执行,返回的结果跳转的页面
name 结果页面逻辑视图名称
type 结果类型(默认值是转发,也可以设置其他的值)
默认的Action和Action默认的处理类
默认的Action
在地址栏上输入一个不存在的action请求,程序会报404的异常。
但是在<package>标签中通过<default-action-ref name="指定action标签name属性"></default-action-ref>来该请求。
Action默认处理类
在地址栏上输入一个正确的action请求,但是<action>标签中的class属性没有写具体的Action类
在<package>标签中通过<default-class-ref class="指定action类的全路径"></default-class-ref>
Struts2配置常用的常量
可以在Struts2框架中的哪些配置文件中配置常量
struts.xml
<constant name="key" value="value"></constant>
web.xml
在StrutsPrepareAndExecuteFilter配置文件中配置初始化参数
struts.i18n.encoding=UTF-8 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法
struts.action.extension=action,, 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开
struts.serve.static.browserCache=true 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
struts.configuration.xml.reload=false 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
struts.devMode = false 开发模式下使用,这样可以打印出更详细的错误信息
struts.enable.DynamicMethodInvocation = true 开启对Action的动态方法访问
指定多个struts的配置文件
在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。
为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。
可以在<package>标签中,使用<include>标签来引入其他的struts_xx.xml的配置文件。例如:
1
2
3
4
|
< code class="hljs xml"> < span class="hljs-tag">< span class="hljs-tag"><< span class="hljs-name">< span class="hljs-tag">< span class="hljs-name">struts< span class="hljs-tag">> < span class="hljs-tag">< span class="hljs-tag"><< span class="hljs-name">< span class="hljs-tag">< span class="hljs-name">include< span class="hljs-tag"> < span class="hljs-attr">< span class="hljs-tag">< span class="hljs-attr">file< span class="hljs-tag">=< span class="hljs-string">< span class="hljs-tag">< span class="hljs-string">"struts-part1.xml"< span class="hljs-tag">/> < span class="hljs-tag">< span class="hljs-tag"><< span class="hljs-name">< span class="hljs-tag">< span class="hljs-name">include< span class="hljs-tag"> < span class="hljs-attr">< span class="hljs-tag">< span class="hljs-attr">file< span class="hljs-tag">=< span class="hljs-string">< span class="hljs-tag">< span class="hljs-string">"struts-part2.xml"< span class="hljs-tag">/> < span class="hljs-tag">< span class="hljs-tag"></< span class="hljs-name">< span class="hljs-tag">< span class="hljs-name">struts< span class="hljs-tag">></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ code > |
实现Action的三种方式
Action类就是一个POJO类
POJO类:
POJO(Plain Ordinary Java Object)简单的Java对象。简单来说,没有继承某个类,没有实现接口,就是POJO的类。
Action类可以实现Action接口
Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法。
大家需要掌握5个逻辑视图的常量
SUCCESS -- 成功.
INPUT -- 用于数据表单校验.如果校验失败,跳转INPUT视图.
LOGIN -- 登录.
ERROR -- 错误.
NONE -- 页面不转向.
Action类可以去继承ActionSupport类
对请求参数进行校验
设置错误信息
读取国际化信息
在Action中获取Servlet相关API的三种方式
在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取
* 完全解耦合的方式
* 使用接口注入的方式
* 使用ServletActionContext中静态方法直接访问Servlet的API
完全解耦合的方式
如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API
一些常用的方法如下:
static ActionContext getContext() 获取ActionContext对象实例
java.util.Map<java.lang.String,java.lang.Object> getParameters() 获取请求参数,相当request.getParameterMap();
java.util.Map<java.lang.String,java.lang.Object> getSession() 获取的代表session域的Map集合,就相当于操sessio域
java.util.Map<java.lang.String,java.lang.Object> getApplication() 获取代表application域的Map集合
void put(java.lang.String key, java.lang.Object value) 注意:向request域中存入值。
使用接口注入的方式
Struts2框架中提供了一些接口,编写的Action类可以是去实现这些接口,然后实现这些接口中的方法,这些方法都是把一些Servlet的常用对象通过参数的方式传递进来。
常用的接口如下:
* ServletRequestAware -- 注入request
* ServletContextAware -- 注入ServletContext
* ServletResponseAware -- 注入response.
使用ServletActionContext中静态方法直接访问Servlet的API
Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法
具体的方法如下
* getPageContext();
* getRequest()
* getResponse();
* getServletContext();
访问Action的三种方式
通过<action>标签中的method属性,访问到Action中的具体的方法
传统的配置方式
具体的实例如下:
页面代码
1
2
|
< code class="hljs dust">< span class="xml">< span class="xml"> < span class="hljs-tag">< span class="xml">< span class="hljs-tag"><< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">href< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"$< span class="hljs-template-variable">{pageContext.request.contextPath}< span class="xml">< span class="hljs-tag">< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">/addBook.action"< span class="xml">< span class="hljs-tag">>< span class="xml">添加图书< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag">>< span class="xml"> < span class="hljs-tag">< span class="xml">< span class="hljs-tag"><< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">href< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"$< span class="hljs-template-variable">{pageContext.request.contextPath}< span class="xml">< span class="hljs-tag">< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">/deleteBook.action"< span class="xml">< span class="hljs-tag">>< span class="xml">删除图书< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag">></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ code > |
配置文件的代码
1
2
3
4
|
< code class="hljs javascript"> < package name=<span class="hljs-string">"demo" extends=< span class="hljs-string">"struts-default" namespace=< span class="hljs-string">"/"> < span class="xml">< span class="hljs-tag">< span class="xml">< span class="hljs-tag"><< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">action< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">name< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"addBook"< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">class< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"cn.zlq.demo.BookAction"< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">method< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"add"< span class="xml">< span class="hljs-tag">>< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">action< span class="xml">< span class="hljs-tag">> < action name=<span class="hljs-string">"deleteBook" < span class="hljs-class">< span class="hljs-keyword">class=< span class="hljs-string">"cn.zlq.demo.BookAction" method=< span class="hljs-string">"delete">< span class="xml">< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">action< span class="xml">< span class="hljs-tag">> << span class="hljs-regexp">/package></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ code > |
Action的代码
1
2
3
4
5
6
7
8
|
<code class = "hljs kotlin" > <span class = "hljs-keyword" > public String add(){ System.<span class = "hljs-keyword" >out.println(<span class = "hljs-string" > "添加图书" ); <span class = "hljs-keyword" > return NONE; } <span class = "hljs-keyword" > public String delete(){ System.<span class = "hljs-keyword" >out.println(<span class = "hljs-string" > "删除图书" ); <span class = "hljs-keyword" > return NONE; }</span></span></span></span></span></span></span></span></code> |
通配符的访问方式
使用通配符的方式可以简化配置文件的代码编写,而且扩展和维护比较容易。
具体实例如下:
页面代码
1
2
|
< code class="hljs dust">< span class="xml">< span class="xml"> < span class="hljs-tag">< span class="xml">< span class="hljs-tag"><< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">href< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"$< span class="hljs-template-variable">{pageContext.request.contextPath}< span class="xml">< span class="hljs-tag">< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">/order_add.action"< span class="xml">< span class="hljs-tag">>< span class="xml">添加订单< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag">>< span class="xml"> < span class="hljs-tag">< span class="xml">< span class="hljs-tag"><< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag"> < span class="hljs-attr">< span class="xml">< span class="hljs-tag">< span class="hljs-attr">href< span class="xml">< span class="hljs-tag">=< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">"$< span class="hljs-template-variable">{pageContext.request.contextPath}< span class="xml">< span class="hljs-tag">< span class="hljs-string">< span class="xml">< span class="hljs-tag">< span class="hljs-string">/order_delete.action"< span class="xml">< span class="hljs-tag">>< span class="xml">删除订单< span class="hljs-tag">< span class="xml">< span class="hljs-tag"></< span class="hljs-name">< span class="xml">< span class="hljs-tag">< span class="hljs-name">a< span class="xml">< span class="hljs-tag">></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span ></ span |