1. 概念
- 2.struts使用优势有哪些
- 自动封装参数
- 参数校验
- 结果的处理(重定向、转发)
- 国际化 i18n
- 表单的重复提交
- 显示等待页面
3.struts的历史, struts2和struts1 没有关系, 前身是webwork 框架
4.导包 地址 G:\jarPackage\SSH\struts-2.3.37\apps\Blank.jar\WEB-INF\lib (需要解压APP中 的blank.jar包)
5.书写action 类
public class HelloAction{
public String hello (){
System.out.println("hello world");
return "success";
}
}
6.书写struts.xml文件
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- package 将action进行封装, name属性 :给包起一个名字 namespace: 给action的访问路径定义一个命名空间 extends:继承一个包 固定的格式,基本上不会变化的 abstract:包是否是抽象的 标示性属性,--> <package name="hello" namespace="/hello" extends="struts-default"> <!-- action属性 name:属性决定了action的访问资源名 class属性:action的完整类名 method: action中的那个方法来处理请求 --> <action name="HelloAction" class="cn.itcase.web.action.HelloAction" method="hello"> <!-- result属性: 结果配置 name属性:标识结果的名称与action中的方法的返回值相对应 type: 指定调用哪一个result类来处理结果 默认使用转发 标签体: 填写页面的相对路径 --> <result name="success"> index.jsp</result> </action> </package> </struts>
7.配置核心过滤器
<!--配置核心过滤器 -->
<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>
8.struts访问流程& struts2架构
9.struts中常量的配置
方式1.从struts.xml 文件中
<constant name="" value="”> </constant>
方式2. src文件创建 struts.properties
struts.i18n.encoding =utf-8
方式三
在项目的web.xml中
<context-param> <param-name> struts.i18n.encoding</param-name>
<param-value>utf_8</param-value5>
5,action中动态方法调用
1.配置常量的方式
<!-- 配置动态方法是否开启常量 默认是关闭的 需要开启-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
2.使用通配符的方式
<action name="HelloAction_*" class="cn.itcase.web.action.HelloAction" method="{1}">
二。书写ACTION类的方式
1.创建一个类就完事了,不需要继承父类 也不需要实现任接口
2.实现一个接口action 里面有execute方法 提供了action方法的规范
action接口中预支了一些字符串,可以再放返回结果时使用,
3.继承ActionSupport 帮助我们实现了validateable validationaware 等接口的实现 就不需要我们来实现了
三。结果集的处理方法 常用的四种方式
<!--转发 -->
<result name="success" type="dispatcher"> index.jsp</result>
<!--重定向 -->
<result name="success" type="redirect"> index.jsp</result>
<!--转发到action -->
<result name="success" type="chain">
<param name="actionName"> demoAction</param>
<param name="namespace">/</param>
</result>
<!--重定向到action -->
<result name="success">
<param name="redirectAction">demoAction</param>
<param name="namespace">/</param>
</result>
四,访问servletAPI 的方式
1.原理。通过actionContext对象,就是一个map集合,里面封装了servlet的原生的api ,生命周期,每次请求都会创建一个一个actiontcontext对象,请求处理完actioncontext对象销毁
2.如何获得actioncontext对象,struts设计的是,将actioncontext对象创建好了之后,将actioncontext对象与当前线程进行绑定,只要从threadlocal 中获得即可,
访问方式一 通过actioncontext对象中获取
推荐方式 Actioncontext.getcontext ().put("name","requestTom");
ActionContext.getcontext.getSession().put("name","sessionTom");
actonContext.getContext.getApplictation();
actonContext.getContext.put();
访问方式二通过ServletAction Context 对象(不推荐使用)
访问方式三 通过接口的方式 ——Implements servletrequestaware 接口
2.action的生命周期
每次请求到来时都会创建一个新的action实例对象,action是线程安全的,可以使用成员变量接受参数
3. 属性驱动获得参数
2.对象驱动
3.模型驱动(推荐使用)
4.集合类型参数封装
1.list集合 map 集合也是一样的一个原理
list :<input type ="text" name ="list"/> </br>
list:<input type="text" name="list[3]></br>
private List<String> list;
五,ognl表达式
1.ognl 表达式 对象视图导航语言 ${user.addr.name} 这样的写法就是对象视图导航语言
ognl表达式不仅可以视图导航,支持el表达使更多的功能,
2.使用ognl表达式的准备工作
1.导包 在struts中已经包含了
2.代码准备ognl表达式
准备ognl表达式
语法
String name= (string ) Ognl.getValue("name",oc,oc.getRoot());
Integer age = (Integer ) Ognl.getValue(:age ,oc, oc,getRoot());
取出 context中对象的name属性
String name =(String) Ognl.getValue("#user1.name" oc, oc.getRoot());
赋值
Ognl.getValue("name=jerry " oc, oc,getRoot());
OGNL 表达式和struts3 结合
结合原理 valuestack 值栈
valueStack中的两部分 compoundroot root ;
transient Map <string ,object> context;
Context 就是actioncontext 数据中心
3.struts与ognl表达式结合体现
1.参数接收
如何获得值栈对象,值栈对象和actoncontext对象是相互引用的
valuesStack vs= ActionContext.getContext().getValueStack();
vs.push(u);’
2.在配置文件中使用
六
六。自定义拦截器
1.第一种创建方式
实现implements接口
2.第二种创建方式
继承 extends AbstractInterceptor 帮助我们空实现了init和destrory方法 只需要实现interceptor方法即可
3.继承MethodFilterInterceptor 方法拦截器
invocation.invoke();放行