1、概述
struts2框架应用javaEE三层结构中的web层,用于显示。
struts2框架在struts1和webwork基础之上发展全新的框架
struts2解决的问题:配置过滤器拦截请求(该类有不同的方法,根据不同请求,执行不同的方法),该类称为action
版本:2.3.24-all比较稳定
web层常见框架:springMVC框架,struts2框架
2、入门案例
第一步:创建web项目
第二步:导入struts框架的jar包,直接在实例程序中找jar包
第三步:创建action
(1)、(java web)每次访问servlet的时候,都会执行service方法
(2)、访问action,每次访问action时候,默认执行execute方法,创建execute方法
(3)、配置action类的访问路径:
a、创建struts2核心配置文件(struts.xml);
b、引入dtd约束,根标签<struts></struts>;
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
c、配置action:
<package name="demo" extends="struts-default" namespace="/">
<action name="hello" class="全类名">
//响应的页面
<result name="ok">/hello.jsp</result>
</action>
</package>
d、访问路径:http://127.0.0.1/demo/hello.action
e:配置过滤器:在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>
*404:服务器未启动or过滤器有问题
3、struts底层基本执行过程
浏览器输入地址发送请求>过滤器(在服务器启动时就创建了)>获取到请求的路径URL(得到uri)>在src下面找到struts.xml,使用dom4j解析,得到xml中内容(action标签,匹配那么属性)>匹配name属性值一样,找到name属性所在的classs属性值,得到action全路径,使用反射实现功能>执行反射代码>得到action方法的返回值,在struts.xml文件中,找到action标签中result标签,匹配result标签的name属性,如果一样,跳转到配置页面中。
//反射代码:让action的方法执行
Class clazz = Class.forName("action全路径");
//得到名称是execute方法
Mothod m = clazz.getMethod("execute");
//方法执行
Object obj = m.invoke();
4、源码查看
StrutsPreparAndExecuteFilter是struts的过滤器,init()方法
在启动服务器的时候创建过滤器,创建过滤器的时候加载init()方法,在init方法中加载主要配置文件(自己创建的文件<web.xml,struts.xml>和struts2自带的文件)
5.struts配置
A、核心配置文件:名称和路径是固定的(名称<struts.xml>,路径<项目的src下>);
B、配置文件中主要三个标签package、action、result。
package标签
1.类似于代码包,区别不同的action,要配置action,必须先写package标签,才能配置。
2.属性:name属性>与功能无关,在一个配置文件中,多个package的name属性值不能相同
extens属性>表示继承的关系,属性值固定struts-default,配置后,表示在package里面配置的类才具备action功能
namespace属性>名称空间,属性值需要与action的name属性值构成访问路径/或者/url/
action标签
1.用于配置action访问的路径
2.属性:name属性>属性值需要与package的namespace属性值构成访问路径,可以有多个action,但name不 能相同
class属性>action全路径
method属性>action默认执行execute方法,也可以执行其它方法,让action里面多个方法执行,使用该属性进行配置
result标签
1.根据action里面的方法返回值,配置到不同的路径里面
2.属性:name属性>和方法的返回值一样
type属性>配置如何到路径中去(转发,重定向等),默认是做转发操作
*转发请求一次,地址栏不会发生变化,重定向请求两次,地址栏发生改变
6、修改struts2默认常量值
(1)常用方式
在struts.xml中进行配置
<constant name = "struts.i18n.encoding" value="UTF-8"></constant>
(2)其它方式<2种>
-在src下面创建struts.properties,进行修改
-在web.xml文件中进行配置
7、介绍常用的常量(待续)
struts.i18n.encoding=UTF-8
(1)表单提交到action里卖弄,在action可以获取表单提交数据
(2)表单提交数据有中文,有乱码问题,解决:post提交直接设置,get提交做编码转换
(3)如果在action获取表单通过post方式提交中文,中文乱码问题不需要自己处理
8、分模块开发
(1)单独写配置文件
(2)核心配置文件中引入其它配置文件
<include file="cn/itcast/action/other.xml"></include>
9、action编写方式
action编写有3中方式
第一种方式:创建普通类,不继承任何类,也不实现任何接口
第二种方式:创建类,实现接口action(用得不是很多)
第三种方式:创建类,继承actionsupport(主要使用的方式)
10、访问action的方法
一共有三种方式
第一种:使用action标签中的method属性,在这里面写执行的action的方法
<action name="add" class="com.xx.action" method="add"></action>
第二种:使用通配符方式实现(重点使用)
表示匹配任意,name属性里面添加‘*’,book_*等进行匹配
<action name="book_*" class="com.xx.action" method="{1}"></action>method是*的值
第三种:动态访问实现(不用)
1.开启struts.enable.DynamicMethodInvocation常量,设置值为true
2.访问:bookAction!add.action
11、域对象操作
1、request
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute(key,value);
2、session
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute(key,value);
3、ServletContext
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute(key,value);