struts学习笔记

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

 

你可能感兴趣的:(struts学习笔记)