一、得到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去接受数据;