Struts2入门详解

如何搭建Struts2项目

导入相干架包

编写web.xml,配置strus2过滤器

<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>

编写Struts2配置文件struts.xml

<?xml version="1.0" encoding="UTF⑻" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts⑵.3.dtd">

<struts>
<package name="default" namespace="/user" extends="struts-default">
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/success.jsp</result>
</action>
</package>
</struts>

访问路径 /user/regist.action
name 包名称,在struts2的配置文件文件中 包名不能重复 ,name其实不是真正包名,只是为了管理Action
namespace 和 action的name属性,决定 Action的访问路径 (以/开始 )
extends 继承哪一个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 )
继承struts-default包后,可使用 包中定义拦截器和结果类型
action元素配置默许值
package 的namespace 默许值‘’‘’
action 的class 默许值 ActionSupport 类
result 的 name 默许值 success

默许Action 和 Action的默许处理类

1) 默许Action , 解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默许Action 就会履行

2) 默许处理类 ,客户端访问Action,已找到匹配元素,但是元素没有class属性,履行默许处理类

* 在struts-default.xml 配置默许处理类 ActionSupport

Struts2的常量配置

1) struts2 默许常量 在 default.properties 中配置
2) 开发者自定义常量

struts.xml
格式 : <constant name="struts.devMode" value="true" />
struts.properties
格式 : struts.devMode = true
web.xml
格式 :
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>

3) 经常使用常量

<constant name="struts.i18n.encoding" value="UTF⑻"/>  ----- 相当于request.setCharacterEncoding("UTF⑻"); 解决post要求乱码 
<constant name="struts.action.extension" value="action"/>  --- 访问struts2框架Action访问路径 扩大名 (要求)
struts.action.extension=action, 默许以.action结尾扩大名 和 不写扩大名 都会分发给 Action
<constant name="struts.serve.static.browserCache" value="false"/> false不缓存,true阅读器会缓存静态内容,产品环境设置true、开发环境设置false 
<constant name="struts.devMode" value="true" />  提供详细报错页面,修改struts.xml后不需要重启服务器 

Action

Action书写的的3种格式

第1种

Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) —- 不需要继承任何父类,实现任何接口
* struts2框架 读取struts.xml 取得 完全Action类名
* obj = Class.forName(“完全类名”).newInstance();
* Method m = Class.forName(“完全类名”).getMethod(“execute”); m.invoke(obj); 通过反射 履行 execute方法

第2种

编写Action 实现Action接口
Action接口中,定义默许5种 逻辑视图名称
public static final String SUCCESS = “success”; // 数据处理成功 (成功页面)
public static final String NONE = “none”; // 页面不跳转 return null; 效果1样
public static final String ERROR = “error”; // 数据处理发送毛病 (毛病页面)
public static final String INPUT = “input”; // 用户输入数据有误,通经常使用于表单数据校验 (输入页面)
public static final String LOGIN = “login”; // 主要权限认证 (登陆页面)
5种逻辑视图,解决Action处理数据后,跳转页面

第3种

编写Action 继承ActionSupport (推荐)
在Action中使用 表单校验、毛病信息设置、读取国际化信息 3个功能

Action的配置method(通配符)

1) 在配置 元素时,没有指定method属性, 默许履行 Action类中 execute方法
2)使用通配符* ,简化struts.xml配置

<a href="${pageContext.request.contextPath }/user/customer_add.action">添加客户</a>
<a href="${pageContext.request.contextPath }/user/customer_del.action">删除客户</a>

struts.xml
<action name="customer_*" method="{1}"></action>   ---  {1}就是第1个* 匹配内容

动态方法调用

访问Action中指定方法,不进行配置
1) 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值 为true
2) 在action的访问路径 中 使用 “!方法名”

页面
<a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>
配置
<action name="product"></action>
履行 ProductAction 中的 add方法

Action访问Servlet API

1、 在Action 中解耦合方式 间接访问 Servlet API ——— 使用 ActionContext 对象

在struts2 中 Action API 已与 Servlet API 解耦合 (没有依赖关系 )
* Servlet API 常见操作 : 表单提交要求参数获得,向request、session、application3个范围存取数据

actionContext = ActionContext.getContext();
1) actionContext.getParameters(); 取得所有要求参数Map集合
2) actionContext.put(“company”, “传智播客”); / actionContext.get(“company”) 对request范围存取数据
3) actionContext.getSession(); 取得session数据Map,对Session范围存取数据
4) actionContext.getApplication(); 取得ServletContext数据Map,对利用访问存取数据

2、 使用接口注入的方式,操作Servlet API (耦合)

1.要求action类必须实现提定接口。
ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象

2.重定接口中的方法。
private HttpServletRequest request;
3.声明1个web对象,使用接口中的方法的参数对声明的web对象赋值.

public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}

3、 在Action中直接通过 ServletActionContext 取得Servlet API

ServletActionContext.getRequest() : 取得request对象 (session)
ServletActionContext.getResponse() : 取得response 对象
ServletActionContext.getServletContext() : 取得ServletContext对象
ServletActionContext.getPageContext().getSession(); //获得session等对象

Action处理要求参数

第1种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )

页面:
用户名 <input type="text" name="username" />
Action :
public class RegistAction1 extends ActionSupport {
private String username;
public void setUsername(String username) {
this.username = username;
}
}

第2种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)

页面:
用户名 <input type="text" name="user.username" />----- 基于OGNL表达式的写法
Action:
public class RegistAction2 extends ActionSupport {
private User user;
public void setUser(User user) {
this.user = user;
}

public User getUser() {
return user;
}
}

使用ModelDriven接口,对要求数据进行封装 (模型驱动 ) —– 主流

页面:
用户名 <input type="text" name="username" /> <br/>
Action :
public class RegistAction3 extends ActionSupport implements ModelDriven<User> {
private User user = new User(); // 必须手动实例化
public User getModel() {
return user;
}
}

封装数据到Collection和Map

1) 封装数据到Collection 对象
页面:

产品名称 <input type="text" name="products[0].name" /><br/>
Action :
public class ProductAction extends ActionSupport {
private List<Product> products;

public List<Product> getProducts() {
return products;
}

public void setProducts(List<Product> products) {
this.products = products;
}
}

2) 封装数据到Map 对象
页面:

产品名称 <input type="text" name="map['one'].name" /><br/> ======= one是map的键值
Action :
public class ProductAction2 extends ActionSupport {
private Map<String, Product> map;

public Map<String, Product> getMap() {
return map;
}

public void setMap(Map<String, Product> map) {
this.map = map;
}
}

要求参数校验

手工代码校验要求参数

步骤1: 封装数据
步骤2: 实现校验Action ,必须继承ActionSupport 类
步骤3: 覆盖validate方法,完成对Action的业务方法 数据校验通过代码逻辑判断参数是不是有效,如果参数非法 , this.addFieldError (ActionSupport提供)workflow拦截器 跳转回 input页面
步骤4: 在jsp中 通过 s:fieldError 显示毛病信息
validate方法会对Action中所有业务方法进行校验,如果只想校验某1个方法 : validate方法名()

Xml配置方式数据校验

位置:xml文件要与action类在同1个包下
名称:action类名-validation.xml(针对某个方法效验UserAction-regist-validation.xml)

<?xml version="1.0" encoding="UTF⑻"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator⑴.0.3.dtd">

<validators>
<!-- 对username属性进行校验 -->
<field name="username">
<!-- 指定username不能为空 -->
<field-validator type="requiredstring">
<!-- 毛病信息 -->
<message>用户名不能为空--------</message>
</field-validator>
<!-- 长度校验,规定用户名必须在6⑴0位之间 -->
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">6</param>
<message>用户名必须在${minLength}-${maxLength}位之间</message>
</field-validator>
</field>

<!-- 对age进行校验,规定年龄必须在10⑷0之间 -->
<field name="age">
<field-validator type="int">
<param name="min">10</param>
<param name="max">40</param>
<message>年龄必须在${min}--${max}之间</message>
</field-validator>
</field>

<!-- 对birthday进行校验 -->
<field name="birthday">
<field-validator type="date">
<param name="min">1974-01-01</param>
<param name="max">2004⑴2⑶1</param>
<message>生日必须在${min}年到${max}年之间</message>
</field-validator>
</field>

<!-- 校验邮箱 -->
<field name="email">
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>

<!-- url校验 -->

<field name="url">
<field-validator type="url">
<message>url不能这空,类似于http://www.baidu.com</message>
</field-validator>
</field>

<!-- 使用正则 -->
<field name="telphone">
<field-validator type="regex">
<param name="regexExpression"><![CDATA[^135[0⑼]{8}$]]></param>
<message>电话号码必须是135xxxxxxxx</message>
</field-validator>
</field>

<field name="repassword">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password==repassword)]]></param>
<message>两次密码输入不1致</message>
</field-validator>
</field>

</validators>

内建校验器
* required (必填校验器,要求被校验的属性值不能为null)
* requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默许情况下会对字符串去前后空格)
* stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是不是去除字符串前后的空格)
* regex (正则表达式校验器,检查被校验的属性值是不是匹配1个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是不是辨别大小写,默许值为true)
* int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
* double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
* fieldexpression (字段OGNL表达式校验器,要求field满足1个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
* email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
* url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
* date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

Result结果类型;

Action处理要求后, 返回字符串(逻辑视图名), 需要在struts.xml 提供 元素定义结果页面
1、 局部结果页面 和 全局结果页面

<action name="result" class="cn.itcast.struts2.demo6.ResultAction">
<!-- 局部结果 当前Action使用 -->
<result name="success">/demo6/result.jsp</result>
</action>

<global-results>
<!-- 全局结果 当前包中 所有Action都可以用-->
<result name="success">/demo6/result.jsp</result>
</global-results>

2、 结果页面跳转类型
result标签
1.name 与action中的method的返回值匹配,进行跳转.
2.type 作用:是用于定义跳转方式

dispatcher:它代表的是要求转发,也是默许值。它1般用于从action跳转到页面。
chain:它也相当于要求转发。它1般情况下用于从1个action跳转到另外一个action。

<!--hello是1个Action的name-->
<result name="success" type="chain">hello</result>

redirect:它代表的是重定向 它1般用于从action跳转到页面
redirectAction: 它代表的是重定向 它1般用于从action跳转另外一个action。

<result name="success" type="redirectAction">hello</result>

stream:代表的是服务器端返回的是1个流,1般用于下载。

在jsp中显示毛病信息

<s:fieldError/>
<s:fielderror fieldName="">展现特定名称的毛病信息.

Struts2国际化

资源文件编写

properties文件命名 : 基本名称语言(小写)国家(大写).properties
编写3个property文件

message.properties

name=tom

messages_zh_CN.properties //中国中文

name=汤姆

messages_en_US.properties //美国英文

name=tom

资源文件作用域

1.针对action类
位置:与action类在同1个包下.
名称:ActionClassName.properties.
这个配置文件只对当前action有效。

2.针对package下所有action
位置:在指定的包下
名称:package.properties

怎样使用

1.在action类中使用
条件:action类要继承ActionSupport类。
getText(String name)就能够获得配置文件中对应名称的值。

2.在validation.xml文件中使用

<message key="名称"/>

3.在jsp页面上使用

s:text name=”名称” 如果没有使用s:i18n name=”“来指定,会从全局配置文件中获得。
如果要从某1个配置文件中获得,通过name属性来指定, 包名.配置文件名称 .

<s:i18n name="cn.itcast.action.package">
<s:text name="nameerror"/>
</s:i18n>

在struts2中国际化配置文件中使用动态文本

1.action中怎样使用

xxxx.property

msg=hello world  {0}

action

this.getText("msg",new String[]{"tom"})

结果就是 hello world tom

2.jsp页面上怎样使用

xxxx.property
msg=hello world {0}

<s:i18n name="cn.itcast.action.I18nDemo1Action">
    <s:text name="msg">
        <s:param>张3</s:param>
    </s:text>
</s:i18n>

结果就是 hello world 张3

Struts2拦截器

struts2中在struts-default.xml文件中声明了所有的拦截器。
而struts2框架默许使用的是defaultStack这个拦截器栈。
在这个拦截器栈中使用了18个拦截器。简单说,struts2框架
在默许情况下,加载了18个拦截器。
注意:只要显示声明使用了1个拦截器。那末默许的拦截器就不在加载。

经常使用struts2 拦截器

<interceptor-ref name="modelDriven"/> 模型驱动
<interceptor-ref name="fileUpload"/> 文件上传
<interceptor-ref name="params"> 参数解析封装 
<interceptor-ref name="conversionError"/> 类型转换毛病
<interceptor-ref name="validation"> 要求参数校验
<interceptor-ref name="workflow"> 拦截跳转 input 视图

自定义拦截器

struts.xml

<interceptors>
<interceptor name="my" class="cn.itcast.intercept.MyInterceptor">
</interceptor>

<interceptor name="bookInterceptor" class="cn.itcast.intercept.BookInterceptor">
<param name="includeMethods">add,update,delete</param>
</interceptor>

<interceptor-stack name="myStack">
<interceptor-ref name="bookInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>

<action name="demo1" class="cn.itcast.action.Demo1Action">
<result name="login">/login.jsp</result>
<!-- <interceptor-ref name="my" /> <interceptor-ref name="defaultStack"/> -->
<interceptor-ref name="myStack" />
</action>

action

public class BookInterceptor extends MethodFilterInterceptor {

@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {

// 1.得到session中的user
User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");

if (user == null) {
BookAction action = (BookAction) invocation.getAction(); // 得到当前拦截的action对象。
action.addActionError("权限不足,请先登录");// 存储毛病信息
return Action.LOGIN;
}
return invocation.invoke();
}
}

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Struts2入门详解

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡