您的位置:首页 > 编程语言 > Java开发

ssh-struts2知识点

2017-11-14 20:19 176 查看
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方法获取ServletAPI
public 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息