一 Struts2 概念:
Struts2框架用于javaee 三层架构中的web层(servlet层 显示层);
Struts2是在Struts1和webwork基础上发展的全新框架。
二 Struts2 的过滤器
类: StrutsprepareAndExecuteFilter
过滤器在服务器(tomcat)启动时就创建了,创建过滤器的时候会执行init(), 在init()方法中主要加载配置文件
struts.xml & web.xml
三 配置文件
struts.xml --->Struts2核心配置文件
位置和名称都是固定的,位置:src目录下,名称:struts.xml(常用)
第二种方式:在src下创建Struts.properties里面进行配置(不常用)
<!-- 引入dtd 文件-->
<struts><!--struts2的根标签-->
<constant name="struts.i18n.enconding" value="utf-8"></constant>
<!--
constant标签 常量标签
在Struts2默认常量值
表单提交数据到Action类里面,如果表单提交数据是通过post提交,可以通过该配置解决中文乱码,如
果是get提交就需要编码转换
-->
<!--分模块开发
单独配置文件把该配置文件引入到核心配置文件中
比如:引入 hello.xml 配置文件
-->
<include file="cn/ss/aciont/hello.xml"/>
<constant name ="struts.enable.DynamicMehodInvocation" value="true"></constant>
<!--
动态访问实现(不用)在struts.xml配置文件中,动态访问在struts2中默认是不开启的,
如果想开启先 开启一个常量
页面访问路径${pageContext.request.contextPath}/userAction!save.action
-->
<package name="demo" extends="struts-default" namespace="/">
<!--
package:类似于代码包 区别不同action 要配置action 必须先配置package
标签package的属性:
name属性:值和功能本身没有关系,在一个配置文件中可以写多个,一个package标签中name属性值不能相同
extends属性:属性值是固定的 struts-default 写了这个属性值之后,在package里面配置的类具有action功能
namespace属性:属性值和action标签的name属性值构成访问路径 不写默认"/" ,一般值为"/"固定的
-->
<!--全局结果页面配置-->
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<!--
如果多个actoin,方法里面返回值相同,到页面也相同 这时候可以使用全局结果页面配置
即配置全局结果页面同时配置局部结果页面,以局部结果页面为准
-->
<action name="hello" class="cn.ss.action.HelloAction">
<!--
action标签配置action访问路径
action标签的属性:
name属性:namespace属性值和action标准中的name属性值构成访问路径,一个package标签里
可以写多个action ,但name值不能一样
classe属性: Action的全路径
method属性: 比如在Action里面默认执行的方法是execute()方法 ,在Action类里面可以写
其他方法,让Action里面多个方法执行,使用method属性配置
-->
<result name="ok" type="dispatcher" >/hello.jsp</result>
<!--
result标签 根据Action的方法返回值 ,配置到不同路径里面
标签result的属性
name属性: method属性值=Action里面方法;方法的返回值=name的属性值
type属性(重点): 配置如何到路径中(转发或重定向) type属性的默认值做转发操作
属性值:dispatcher 默认值;做转发操作 值:dispatcher
属性值:redirect 做重定向
属性值:chain 转发到action 一般不用 会有缓存数据
属性值:redirectAction 重定向到action
</action>
<action name="customer_*" class="cn.ss.action.CustomerAction" method="{1}">
<!--
使用通配符*实现 actio标签的name属性写符号*
执行Action类里面的add()方法,访问customer_add,使用customer_*,可匹配到* 相当于变成add
执行Action类里面的update()方法,访问customer_update,使用customer_*,可匹配到* 相当于
变成update
使用* 匹配任意方法内容
method属性值 取值*里面写"{1}"
-->
</action>
</package>
<struts>
web.xml
配置Struts2的过滤器
<web-app><!--web.xml配置文件的根目录-->
<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>
四 Action 类编写的三种方式
1. 创建普通类,这个类不继承任何类 不实现任何接口
2.创建类实现接口Action
3.创建类继承AtionSupport类(ActionSupport implements Action)(常用)
Action接口中有常量值可以直接拿来使用 SUCCESS="success" NONE="none"
none 表示方法没有返回值 这时候不需要配置result标签;
相当于方法public void 方法名(){},(这样写类也可以实现Action 但不常用)
五 访问Action的方法(重点)
1.使用action标签中的method属性值,属性值写Action方法名
2.使用通配符*实现 actio标签的name属性写符号*=Action类方法名 任意方法名,action标签里的method属性值 取*值 写{1}
3.动态访问实现(不用)
在struts.xml配置文件中,动态访问在struts2中默认是不开启的,如果想开启先开启一个常量
<constant name ="struts.enable.DynamicMehodInvocation" value="true"></constant>
页面访问路径${pageContext.request.contextPath}/userAction!save.action