一、得到HttpServletRequest、HttpSession、HttpApplication对象
1、 通过ActionContext类来得到HttpServlet一组对象
//--申明对象获得request对象
ActionContext ac = ActionContext.getContext();
//获得对象
Map request = (Map) ac.get("request");--获得request对象
Map session = ac.getSession(); --获得session对象
Map application = ac.getApplication(); --获得application对象
//存值
session.put("user",user);--存信息
//取值
${User.name } –-取数据
二、配置文件中的设置
1、设置用户界面,默认值为xhtml风格
<constant name="struts.ui.theme" value="simple"></constant>
2、设置提交容许的后缀
<constant name="struts.action.extension" value="aspx,do,html"/>
3、struts.xml处理动态方法、动态结果
1、struts.Xml文件里的配置
<action name="Login" class="web.action.LoginAction" method="login" >
<result name="success" type="dispatcher">${tiaoZhuan}</result>
</action>
<!-- 注册验证 -->
<action name="Register" class="web.action.LoginAction" method="register">
<result name="success" type="redirect">${tiaoZhuan}</result>
</action>
注释:
通过method属性的值来决定处理请求的是web.action.LoginAction的那个方法;
${tiaoZhuan} —- 动态结果;
2、页面处理请求实现动态请求
<form action="Register!login.action" method="post">
4、通配符处理动态请求
<!—
用户验证通配符验证
name="*User";拦截所有以User结尾的请求
method="{1}";截取请求User前面的类容
-->
<action name="*User" class="web.action.LoginAction" method="{1}" >
result name="success" type="dispatcher">${tiaoZhuan}</result>
action>
//页面
<form action="loginUser.action" method="post">-- Login页面
<form action="registerUser.action" method="post">--注册页面
5、常用结果类型(result里面的配置)
例:<result name="success" type="redirect">${tiaoZhuan}</result>
1、dispatcher —- 默认转发
2、redirect –- 重定向
3、redirectAction --- 针对*.Action或者*.*请求的重定向
6、全局结果
<!-- 设置全局结果,全部的 input,error都来这里处理-->
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="input">Login.jsp</result>
<result name="error">cuoWu.html</result>
</global-results>
。。。。。。
</package>
7、配置默认的Action
<package name="default" namespace="/" extends="struts-default">
<!-- 配置默认的处理请求,如果找不到Action就进入defaultAction里根据defaultAction的结果返回 -->
<default-action-ref name="defaultAction"/>
<!-- 默认的Action处理 -->
<action name="defaultAction">
<result>cuoWu.html</result>
</action>
</package>
8、处理中文乱码的配置
<!—- il8n是’L’不是’一’-->
<constant name="struts.il8n.encoding" value="UTF-8" />
三、拦截器; 例子:Struts2_005Text
1、申明拦截器
<interceptors>
<!--
定义拦截器
name="myTime"拦截起名字
class="interceptor.TimerInterceptor"拦截器的全局定名
-->
<interceptor name="myTime" class="interceptor.TimerInterceptor" />
</interceptors>
2、设置默认引用拦截器
<!--设置默认引用拦截器,与interceptors,package同级 -->
<default-interceptor-ref name="myTime" />
3、在action中调用拦截器
<action name="*User" class="web.action.LoginAction" method="{1}" >
<!-- 为Action设置拦截器 -->
<interceptor-ref name="userCheck">
<!-- 设置不拦截的方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 元素拦截器,动态改变Action中message元素的值 --> <param name="message">aaaaaa</param>
<!-- 调用默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<result name="success" type="dispatcher">${tiaoZhuan}</result>
</action>
4、拦截器类的写法
public String intercept(ActionInvocation invocation) throws Exception
{
//开始时间
long startTime = System.currentTimeMillis();
//执行后续拦截器或Action,返回结果
String result = invocation.invoke();
//后续处理工作
long executionTime = System.currentTimeMillis() - startTime;
System.out.println("这次拦截花费" + executionTime + "时间");
return result;
}
注:
调用下一个方法:(String result = invocation.invoke());
拦截器类可以不去调用下一个拦截器直接返回一个字符串(return “eooor“;)
将结果返回给程序;
5、拦截器全些法
<interceptors>
<!--
定义拦截器
name="myTime"拦截起名字
class="interceptor.TimerInterceptor"拦截器的全局定名
-->
<interceptor name="myTime" class="interceptor.TimerInterceptor"/>
<interceptor name="userCheck" class="interceptor.UserInterceptor"/>
<!-- 拦截器栈 -->
<interceptor-stack name="MyStack">
<!-- 引用其他拦截器 -->
<interceptor-ref name="myTime"/>
<!-- 引用userCheck拦截器,并为该拦截器设置不拦截的方法 -->
<interceptor-ref name="userCheck">
<!-- 设置不拦截的方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!-- 引用struts2默认的拦截器,(必需要加,不然可能出现问题) -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 设置默认引用的拦截器栈或拦截器(设置拦截器和拦截器栈语法一样) -->
<default-interceptor-ref name="MyStack"/>
4、使用struts2自带的报错文档
1、需要将核心配置文件的 -- fielderror.ftl 路径到myEclps安装目录下找;
2、将<li></li>删除,<ul 改成<lable
3、将该过得文件粘贴到文工程下
4、struts2中Ajax支持 <sx:a href="FenYelookupAllHouse?page =%{#session.pageSize+1}" targets="xianShi">下一页</sx:a>
传值
四、国际化; 例子 -- Struts2_005Text
1、编写资源文件
1、文件命名规则
以“.properties”为后缀例:.properties
2、文件内容
user.name=name;
user.passWord=password
sumber=login
user.name表示键name是值,在页面通过struts2标签通过键取值;
例:
<s:textfield key="user.name" name="user.name" />
注:
key="user.name"键
name="user.name"表示文本框的值
2、在struts.xml配置资源文件
<!—
指定资源文件的名字和路径
-->
<constant name="struts.custom.i18n.resources" value="message"/>
五、验证框架(实例);例子 -- Struts2_005Text
1、创建RegisterAction实现对注册的处理
2、在struts.xml中配置action
<!-- 用户验证通配符验证 -->
<action name="*User" class="web.action.LoginAction" method="{1}" >
<!-- 元素拦截器,动态改变Action中message元素的值 -->
<result name="success">${tiaoZhuan}</result>
<!-- 配置验证框架后必须配置input类型的返回值,用来控制跳转页面 -->
<result name="input">register.jsp</result>
</action>
3、创建jsp页面
<body>
<s:form action="registerUser" method="post" theme="simple">
<s:text name="user.name"/>
<s:textfield key="user.name" name="user.name" /><br/>
<!-- 用户名错误信息显示 -->
<s:text name="user.passWord"/>
<s:password key="user.passWord" name="user.pwd" /><br/>
<!-- 密码错误信息显示 -->
<s:fielderror cssStyle="color: red" fieldName="user.passWord" />
<s:password label="确认密码" name="repassWord"></s:password>
<s:fielderror cssStyle="color: red" fieldName="agpwd" />
<s:textfield label="电话号码" name="user.telephone"></s:textfield>
<s:fielderror cssStyle="color: red" fieldName="user.telephone" />
<s:submit value="注册"></s:submit>
</s:form>
</body>
4、创建验证文件,使用验证框架编写验证规则
<validators>
<!-- 验证用户名 -->
<field name="user.name">
<!-- 验证非空 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<!-- 验证长度 -->
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">4</param>
<message>用户名必须在${minLength}~${maxLength}</message>
</field-validator>
</field>
<!-- 验证密码非空 -->
<field name="user.passWord">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
<!-- 确认密码是否一致 -->
<field-validator type="fieldexpression">
<param name="expression">user.passWord==repassWord</param>
<message>两次密码必须相同</message>
</field-validator>
</field>
</validators>
注:
1、<field name="user.name">里name必须是对象点属性
2、<field-validator type="requiredstring">type表示验证类型
1、Requiredstring —- 验证是否为空
2、stringlength —- 验证长度
3、fieldexpression -- 验证两次输入是否一致
1、expression –- 表示匹配字符
4、regex – 自定义
<field-validator type="fieldexpression">
<param name="expression">正则表达式或表达式 </param>
<message>格式不符 </message>
</field-validator>
3、文件命名:className-validation.xml或ClassName-alias-validation.xml
className表示action的名字(RegisterAction)
alias表示配置在struts里Action的名字
<action name="*User" class="web.action.LoginAction" method="{1}" >
4、文件放在于action相同的目录下
六、OGNL表达式—- 例子:leiXingZhuanHuan
1、<s:set name="age" value="10" scope="request"/>
Scope属性用于指定变量的作用域,取值范围可以是page,request,session,application,和action。如果没有指定scope,取默认值action,变量将被同时保存到request作用域中和ActionContext。
2、从作用域中取值
1、将值存入变量age的值存到request作用域中,然后取出
<s:set name="age" value="10" scope="request"/>
<s:property value="#request.age"/>
、通过迭代从作用用中取(集合)值
<s:iterator value="#session.listHouse" id="house">
<s:property value="#house.title"/>
</s:iterator>
OGNL表达式案例:leiXingZhuanHuan
<body>
录入信息如下:<br/>
名称:<s:property value="name"/> <br/>
年龄:<s:property value="age"/> <br/>
生日:<s:property value="birthday"/> <br/>
坐标:<s:property value="point"/> <br/>
--------------------测试OGNL取后台值栈里集合的值---------------------
<br/>
<!--
<s:iterator value="listpoint" id="p"></s:iterator>迭代标签
迭代集合(集合中存得是对象)
测试 OGNL取值(listPoint值栈里面集合的值)
vavalue取出后台存入时的集合,迭代为对象或值
id为对象取一个别名,如果是对象的话,处理后是将值存入作用域中,而不是值栈
-->
---迭代集合中的对象 <br/>
<s:iterator value="listpoint" id="p">
<!--
<s:property value="#p.x"/> OGNL表达式的取值标签,如果不指定value则默认取栈顶元素
value,带#表示是从作用域中取值,不带则表示从值栈中取值
struts2所有标签都支持OGNL表达式例如:<s:url value="%{#p.x}"/>,也能取出对象point的属性值
-->
<s:property value="#p.x"/> <br/>
</s:iterator>
<!-- 迭代对象 -->
---迭代对象 <br/>
<!--
直接去值栈中取对象value="point"不用去给对象取别名
直接通过<s:property value="x"/>就可以取出对象的属性值(x是point的属性)
-->
<s:iterator value="point" >
<s:property value="x"/> <br/>
<s:property value="y"/> <br/>
</s:iterator>
-----------------------测试前台存值然后取值------------------------ <br/>
<!--
将值存入变量age的值存到request作用域中
value可以存字符串、数字也可以存对象
例:value="User",存的是对象;value=" 'User' "存得就是字符串
在不知道输出的是对象还是字符串的时候加上"%"表示输出字符串;例:%{#session.NumberAll}
-->
<s:set name="number" value="15" scope="request"/>
<s:property value="#request.number"/>
<br/>
-------------------------------%的作用------------------------------
<br/>
<s:set name="myurl" value="'http://localhost:8080/mvc'"/>
<s:url value="#myurl"/>
<br/>
<s:url value="%{#myurl}"/>
</body>
七、自定义类型转换器--例子:leiXingZhuanHuan
例子
创建自定义类型转换器,且继承StrutsTypeConverter,实现
1、将一个或多个字符串值转换为指定的类型
public Object convertFromString(Map context, String[] val, Class toType)
2、将指定对象转化为字符串
public String convertToString(Map context, Object object)
2、 配置类型转换器(2种方式)
1、全局:
1、文件名:固定不变
xwork-conversion.properties
2、文件里写的类容:
转换类全名=转换器全名
例:entity.Point=converter.PointConverter
或
java.util.Date=converter.DateConversion
3、文件存放路径:src跟目录下
2、特定类:
1、文件名(红色部分固定),className表示需要类型转换的类的名字(必须一样)
className-conversion.properties
例:RegisterAction- conversion.properties
2、文件下写的内容
特定类下的属性名=转换器全名
例:point= converter.PointConverter
3、文件存放路劲
于需要能转换的特定类相同跟目录
3、定制转换错误信息
1、所有类型的转换错误信息(全局)
1.在struts.xml中指定资源文件的基名
<constant name="struts.custom.i18n.resources" value="full"/>
注:value的值自定义,但是必须于报错文档相对应 full.properties
2.在full.properties中创建key-value
xwork.default.invalid.fieldvalue =字段“{0}”的值无效
注:xwork.default.invalid.fieldvalue是固定不变的
2、定制特定的转换错误信息
在action的目录下创建一个资源文件RegisterAction.properties
RegisterAction:action类名一致(特定类型转换类),properties固定不变
文件类容
invalid.fieldvalue.birthday=生日转换错误
invalid.fieldvalue固定不变,birthday类对应的属性
八:struts2标签
1. 迭代标签
1、 通过该方法可以得到迭代时的序列号
<s:iterator value"resultList" id="result" status='st'>
下标为:<s:property value='#st.index'/>
</s:iterator>
3、小结
1、Action必须有一个返回类型是String的类;返回值随意但是返回值必须和struts.xml配置文件相对应;
2、Action类可以是继承ActionSuppor的类,也可以是实现Action的类,也可以是普通类;
3、当Action类要做前台验证时就必须是继承ActionSuppor的类;
4、Action类有属性申明、方法
经验:
1、 在web.xml配置文件中Error pages下可以设置拦截器,拦截404。。。,以及错误如Exection等;
2、 命名要规范,不能用关键字;
3、 对象在前台不需要加载
4、 在struts2要用list集合,则需要将hibernate配置文件中的<set>节点改成<bag>节点,实体类用list去接受数据;