ssh-struts2知识点

来源:互联网 发布:半身裙淘宝店好一点 编辑:程序博客网 时间:2024/05/20 09:05

struts2的简单介绍
1.什么是struts2
1>运行在web层.负责处理请求的.
2>struts2已经帮我们封装了很多web中常用的功能(最有作用的拦截器)
3>struts2 与 struts1 没什么关系. struts2是基于webwork框架

2.struts2有哪些使用优势
自动封装参数
参数校验
结果的处理(转发|重定向)
国际化(=================)
显示等待页面
表单的防止重复提交
struts2具有更加先进的架构以及思想(AOP模式,面向切面的编程,在运行中加入代理的方式,实现功能的优化)

3、struts2框架搭建
1> 导包 (打开一个工程示例,找到lib里面的所有jar包)
|- struts2/apps/struts-blank.war/WEB-INF/lib
2> 书写Action (浅显的说是 代替servlet处理和发送数据)
3> 书写 主配置文件 src/struts.xml (在src路径下,名称不要变)
4> 在web.xml 配置 过滤器(在web.xml中 web-app里)|- strutsprepareAndExecuteFilter

<filter>    <filter-name>struts2</filter-name>    <!-- struts2的核心类-->    <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>

struts2 架构

配置详解
struts2 核心配置

<!-- package:将Action配置封装.就是可以在Package中配置很多action.            name属性: 给包起个名字,起到标识作用.随便起.不能其他包名重复.            namespace属性:给action的访问路径中定义命名空间(即在地址前加前缀)            extends属性: 继承一个 指定包 (默认必须 是 struts-default)            abstract属性:包是否为抽象的; 标识性属性.标识该包不能独立运行.专门被继           承  -->    <package name="hello" namespace="/hello" extends="struts-default" >            <!-- action元素:配置action类                name属性: 决定了Action访问资源名.                class属性: action的完整类名                method属性: 指定调用Action中的哪个方法来处理请求,默认为execute                 -->        <action name="HelloAction" class="cn.itheima.a_hello.HelloAction" method="hello" >          <!-- result元素:结果配置             name属性: 标识结果处理的名称.与action方法的返回值对应.默认success            type属性: 指定调用哪一个result类来处理结果,默认使用转发  dispatcher           (重定向:redirect)            标签体:填写页面的相对路径         -->        <result name="success" type="dispatcher" >/hello.jsp</result>                   </action>        <!--配置默认action(如果struts没有找到用户定义的action名称,则会自动跳转到                该默认定义的action中。) -->    <default-action-ref name="dispatcher" />        <action name="defaultAction">            <result>error.jsp</result>        </action>    </package>

占位符和动态方法访问

 <!-- 使用占位符 --><action name="Action_* ":访问的action, class:类全名  method="{1}">    <result name="结果返回值" type="返回值处理类型,转发/重定向" >/hello.jsp</result><!—动态方法访问xxxAction!xx方法)--><!--关闭动态方法调用<constant name="struts.enable.DynamicMethodInvocation" value="false" />

struts2 常量配置

<!-- i18n:国际化. 解决post提交乱码 -->    <constant name="struts.i18n.encoding" value="GBK"></constant>    <!-- 指定反问action时的后缀名 value默认为 action时,地址栏可以不写后缀 -->        <constant name="struts.action.extension" value="action"></constant>         <!-- 指定struts2是否以开发模式运行        1.热加载主配置.(不需要重启即可生效)        2.提供更多错误信息输出,方便开发时的调试    -->    <constant name="struts.devMode" value="true"></constant><!--修改ognl标签风格  simple没有样式: -->    <constant name="struts.ui.theme" value="simple" />     <!-- 引入其他struts配置文件--><include file="cn/itheima/b_dynamic/struts.xml"></include>

修改struts2常量配置(方式先后也是加载顺序)
方式1:src/struts.xml
方式2:在src下创建struts.properties
方式3:在项目的web.xml中
struts2 结果的跳转
(修改action元素下的 result元素的 type属性)

<!--  转发 -->    <action name="Demo1Action" class="Demo1Action" method="execute" >        <result name="success" type="dispatcher" >/hello.jsp</result>    </action>    <!-- 重定向 -->    <action name="Demo2Action" class=" Demo2Action" method="execute" >        <result name="success" type="redirect" >/hello.jsp</result>    </action>    <!-- 转发到Action -->    <action name="Demo3Action" class=" Demo3Action" method="execute" >         <result name="success" type="chain">            <!-- action的名字 -->             <param name="actionName">Demo1Action</param>       ·   <!-- action所在的命名空间 -->              <param name="namespace">/</param>         </result>    </action>    <!-- 重定向到Action -->        <action name="Demo4Action" class=" Demo4Action" method="execute" >            <result  name="success"  type="redirectAction">                 <!-- action的名字 -->                 <param name="actionName">Demo1Action</param>                 <!-- action所在的命名空间 -->                 <param name="namespace">/</param>            </result>        </action>

全局结果跳转
当一个Action返回的String没有相应的与之对应,Struts2就会查找全局的。

<global-results>        <result name="error">/page/error.jsp</result>        <result name="login" type="redirect">/page/login.jsp</result></global-results>

Action
Struts2框架是低耦合的,可以用以下方法创建action类
1> POJO 普通java类.不需要继承,不需要实现
2> 实现Action接口.
3> 继承ActionSupport.(推荐)

Action方法
(格式为 public String xxx() 返回值为String)
public String xx() throws Exception{}
扩展
1、在Action中加入错误信息(继承Action), this.addActionError(“出错了”); //在界面引入struts标签直接获取
//jsp转发

访问servetAPI的方式
详细查询ActionContext继承和实现(获取request、response、pageContense等)
有三种方式,从原理上来看可以是一样的,从ActionContext 获取,是线程安全的
1、原理:从数据中心(ActionContext)获取

public String execute() throws Exception {    //request域=> map (struts2并不推荐使用原生request域)    //不推荐    Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");    //推荐    ActionContext.getContext().put("name", "requestTom");    //session域 => map    Map<String, Object> sessionScope = ActionContext.getContext().getSession();    sessionScope.put("name", "sessionTom");    //application域=>map    Map<String, Object> applicationScope = ActionContext.getContext().getApplication();    applicationScope.put("name", "applicationTom");    return SUCCESS;}

2、获取原生的api
**

public String execute() throws Exception {    //原生request    HttpServletRequest request = ServletActionContext.getRequest();    //原生session    HttpSession session = request.getSession();    //原生response    HttpServletResponse response = ServletActionContext.getResponse();    //原生servletContext    ServletContext servletContext = ServletActionContext.getServletContext();    return SUCCESS;}

**
3、实现接口,ServletRequestAware
实现接口,重写方法,与原理想通,源码都指向一个方法

//通过get方法获取ServletAPIpublic class Demo7Action extends ActionSupport implements ServletRequestAware {    private HttpServletRequest request;    public String execute() throws Exception {         System.out.println("原生request:"+request);        return SUCCESS;    }    @Override    public void setServletRequest(HttpServletRequest request) {        this.request = request;    }}

Struts2 获取参数
Struts2ed参数存放在ert域中,每次请求Action时都会创建新的Action实例对象,是线程安全的
1、扩展–Struts2 的mvc模式
客户端/过滤器 -> c:Filter -> M: Action -> Result ->Action类

2、声明周期:每次请求到来时,都会创建一个新的Action实例
Action是线程安全的.可以使用成员变量接收参数

获取参数的三种方式:属性驱动、对象驱动、模型驱动
重点内容
属性驱动
jsp中
在Action类中,设置与key相同的成员变量加入set、get方法即可获取参数

对象驱动
在前端中设置 对象user 如:
在Action类中,设置成员对象 private User user;(加上set和get方法)即可获取对象。
可以定义一个map集合对象,在页面中放入map中(name=”map.key”),方便存取多个对象。

模型驱动
实现 ModelDriven 接口
private User user = new User();
//实现方法
public User getModel(){
return user;
}
/*
从源码来看,模板驱动是在拦截器设置对象值之前压入栈顶,具体看源码
*/
获取集合参数
//Action中(需要加上set和get方法)
private List list;
//Map
private Map

<package name="inter" namespace="/" extends="struts-default" >    <!--  配置全局结果集  type="redirect" 重定向 -->    <global-results>        <result name="error" type="redirect" >/login.jsp</result>        </global-results>           <interceptors>        <!-- 1.注册拦截器 name属性在后面配置用到,class属性:类的全名 -->            <interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor>        <!-- 2.注册拦截器栈 -->            <interceptor-stack name="myStack">                <!-- 自定义拦截器引入(建议放在20个拦截器之前) -->            <interceptor-ref name="myInter3">                <!-- 指定哪些方法不拦截                 <param name="excludeMethods">add,delete</param> -->                 <!-- 指定哪些方法需要拦截 -->                 <param name="includeMethods">add,delete</param>            </interceptor-ref>                <!-- 引用默认的拦截器栈(20个) -->            <interceptor-ref name="defaultStack"></interceptor-ref>            </interceptor-stack>            </interceptors>        <!-- 3.指定包中的默认拦截器栈 -->    <default-interceptor-ref name="myStack"></default-interceptor-ref>    <action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" >        <!-- 为Action单独指定走哪个拦截器(栈)         <interceptor-ref name="myStack"></interceptor-ref>-->        <result name="success" type="dispatcher" >/index.jsp</result>    </action></package>

struts2使用基于Dojo的ajax标签
使用步骤:
1、导入 struts2-dojo-plugin-2.1.x.x.jar 包
2、导入标签库:<%@taglib prefix=”sx” uri=”/struts-dojo-tags”%>
3、中加入head标签,用于加入css和js的库:
4、常用标签:

<sx:div> 创建一个div区域,可以通过Ajax向其中加载 内容,以实现局部刷新         <sx:submit> 通过Ajax来更新某个元素的内容或提交表单        <sx:a> 通过Ajax来更新某个元素的内容或提交表单         <sx:tabbedPanel> 创建一个标签面板,由<s:div>来提供内容。         <sx:autocompleter> 根据用户输入提供输入建议,或者帮助用户 自动完成输入         <sx:tree> 创建一个支持Ajax的树形组件(Widget)示例表单使用dojo的标签(ajax)提交到action ,该action返回的jsp信息填充到 targets 属性的位置    <body>     <h2>用户登录</h2>    <s:form id="form1" action="login">   //ognl的表单标签        <s:textfield name="username" label="用户名" />          <s:password name="password" label="密码" />        <sx:submit type="button" value="表单内提交" targets="div2" />  //dojo的表单提交    </s:form>          <sx:submit type="button" value="表单外提交" targets="div2" formId="form1" /><br>   //dojo的指定提交表单        <sx:a targets="div2" formId="form1">我也可以提交表单</sx:a>   //dojo 用超链接指定提交表单(可以配合隐藏表单域提交信息)    </body>         formId 属性: 提交的表单。    targets: 局部刷新的区域    href : 点击链接地址    <span> <sx:a targets="login" href="page/list_login.jsp" >登录</sx:a></span>

使用总结
1、用ajax标签的时候注意Struts标签可以与dojo标签可以一起使用,而el最好不要混用。
2、注意:url标签的value填入的是String。a标签href 填入的是String 不能放入变量。
可以使用url的param属性添加变量,而且如果要使用变量则应该用 %{ }的格式。
3、在使用标签取值的时候要注意,是否在值栈中(在值栈中应有set/get方法)非值栈中的属性应用 # 符号。使用Struts标签应用property标签取值

//param属性添加参数number=prev

上一页

struts2的验证框架
原理
在struts2拦截器链中,params拦截器将请求的参数反射的设置到Action的属性;conversionError拦截器验证Action的属性是否符合条件。而验证框架的拦截器是在这之后也就是说验证的是值栈中的参数;
Struts2提供了基于验证框架的输入校验,每个action可定义一个校验文件,文件名格式为: ActionName-validation.xml ActionName可变,后面固定不变,该文件保存在与Action class文件相同的路径下. 当校验失败后struts2自动返回名为”input”的result.在校验失败后的页面添加输出错误提示
使用步骤
1、创建验证配置文件放在action文件同目录下: 文件名为 ActionName-validation.xml(ActionName为处理信息的action类名)
2、书写验证配置信息(详细查看资料)
注意:验证错误会在struts的对应action配置中返回字符串”input”到result元素中,注意配置一个input的result.
3、在界面中使用 可以接收到所有错误信息
注意
1、验证的属性如果没有在action定义,则可能会无法找到,导致验证失败。
2、当一个action中有多个方法,而只需要对其中一部分方法使用验证时不能直接将整个action方法进行验证,解决方法:
a、创建的验证配置文件名修改为 Actionname-methodName-validation.xml //action类名-要验证的方法名
b、推荐在不需要验证的方法前使用注解:@SkipValidation

国际化
相关知识点
Internationalization 18字母 简称I18N,让应用程序依据地区不同显示不同的信息.
Locale 实例包括了语系与区域的信息。 通过创建Locale实例获得相应区域的语言信息
//创建指定区域的locale对象
Locale locale=new Locale(Locale.US.getDisplayLanguage(),Locale.US.getCountry());
//获得当前系统的locale对象 语言和国家
Locale locale = Locale.getDefault();

使用Struts2实现国际化的步骤
1、每个地区的语言资源文件:资源文件必须是ISO-8859-1格式
资源文件名:如:xxx-zh-CN.properties
2.加载全局资源文件,在struts2的配置中加入

3.访问国际化资源文件
jsp中:
//访问资源文件keyName对应的value值,返回String
//在struts2的表单标签中使用
action中:
使用ActionSupport类的getText(keyName)
Struts2标签+OGNL表达式
背景知识
1、OGNL表达式是一个开源项目,取代页面中Java脚本,简化数据访问和EL同属于表达式语言, 但功能更为强大
2、将表单或Struts 2标签与特定的Java数据绑定起来,用来 将数据移入、移出框架
OGNL:对象视图导航语言。如el+jstl:${uesr.name}
3、在struts中视图通过标签直接访问Action的属性值
使用步骤
1、导包 //Struts2包中已有OGNL包、不需要额外导包
2、使用OGNL表达式:
OGNL的取值域为OgnlCtext (就像el的取值域为 ettr )
OgnlContext oc = new OgnlContext(); //获得OgnlContext
ognl分为
root(值栈): 可以放置任何对象做root都可以,本质是 List
private User user = new User(); //准备root
oc.setRoot(user); //放入OgnlContext 的 root
context(非值栈): 可以是键值对 Map
Map map