一、基础:
1.1执行流程:浏览器》web.xml》Action》(成功>success.jsp)》失败>failure.jsp
1.2 继承com.opensymphony.xwork2.ActionSupport完成输入校验
1.3国际化资源文件:
1.3.1文件的名字有严格的限制,格式是name_语言代码_国家代码.properties
1.3.2在中文转换问题可以用命令:native2ascii 源文件文件 目标文件.
1.3.3加载资源文件在struts.xml里配置<constant name="struts.custom.i18n.resources" value="资源文件名"></constant> 第二种方法:在struts.properties里配置一个struts.custom.i18n.resources=资源文件名
1.4输出国际化资源文件信息
<s:text name="国际化资源文件中的key">在其他里通过key来输出,如<s:testfield name="name" key="login.username">;login.username是资源文件里的属性。
二、类型转换:
2.1 Struts2的类型转换器是基于ogml实现的,要实现自定义类型转换可以实现DefaultTypeConver或strutsTypeConvertert接口
注册自定义类型转换器
只需在Action目录下新建一个Actionname-conversion.properties
在文件里指向Actionname
2.2局部类型转换器
特点是在注册自定义类型转换器里指定是哪个类型,如:othername=net.Name.Convert
2.3全局类型转换器
特点是注册自定义类型转换器里指定转换类型的类名如:net.Name=net.Name.Convert
2.4类型转换中错误的处理
2.4.1定义全局类型的转换错误处理
分别在中文环境境资源文件和英文环境资源文件里指定,如:xwork.default.invalid.dieldvalue={0}字段类型失败:或{0}error
2.4.2 定义局部类型的转换错误处理
分别在中文环境境资源文件和英文环境资源文件里指定invalid.dieldvalue.属性名=错误提示信息,如:invalid.dieldvalue.age=请输入正确的年龄格式
2.5基本的类型转换例子
登陆页面:input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'input.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="input">
<s:textfield name="name" label="name"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="brith" label="brith"></s:textfield>
<s:submit value="ti"></s:submit>
</s:form>
</body>
</html>
输出页面output.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'output.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:property value="name"/><br>
<s:property value="age"/>
<s:property value="brith"/>
</body>
</html>
InputAction.java
package net.hucn.action;
import java.util.Date;
import net.hucn.bean.Name;
import com.opensymphony.xwork2.ActionSupport;
public class InputAction extends ActionSupport {
private Name name;
private int age;
private Date brith;
public InputAction(){}
public void setName(Name name) {
System.out.print("fjjjjjjjjjjfff");
this.name = name;
}
public Name getName() {
return name;
}
public Date getBrith() {
return brith;
}
public void setBrith(Date brith) {
this.brith = brith;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String execute()throws Exception{
return SUCCESS;
}
}
2.6组类型的转换特点是在输入页面的标签里属性name用同一个名字在label里用不同的名字,输出页面value用的是属性name的名字在ActionSupport的继承类里定义输入页面的属性name的数组类型
2.7合类型的转换特点是在输入页面的标签里属性name用同一个名字在label里用不同的名字,输出页面value用的是属性name的名字在ActionSupport的继承类里定义输入页面的属性name的集合类型
三、输入校验
3.1客户机校验可以有js校验:可以用正则表达式校验
服务机校验可以在java类里校验
3.2输入校验流程
浏览器》对请求参数进行类型转换》类型转换判断?{(有错误)将错误信息提示保存到fieldError中}:(没错误)执行validate方法》包含fieldError》?跳转到input对应的视图资源:调用Action处理的逻辑方法>(进行业务逻辑处理)》跳转到相应的视图资源
四、校验框架
4.1在原有的校验文件的基础上只需添加一个xml格式的校验规则文件,文件名是ActionName-validation.xml其中ActionName是类名
校验文件有字段校验风格和非字段校验风格:
字段校验风格:
<validators>
<field name=”被校验的字段”>
<field-validator type=”使用校验器名称”>
<param name=”参数名”>参数值</param>
<message key=”国际化资源key”>错误提示</message>
</field-validator>
</field>
</validators>
非字段校验风格
<validators>
<validator type=”使用校验器名称”>
<param name=”fieldname”>被校验字段</parma>
<param name=”参数名”>参数值</param>
<message key=”国际化资源key”>错误提示</message>
</validator>
</validators>
4.2内建校验器
这个是类包提供的
4.3校验短路
要想实现短路这种效果,只需在field-validator元素(字段校验配置)里或者在valitor元素(非字段校验配置)中增加一个short-circuit属性,并设置值为true
字段校验风格:
<validators>
<field name=”被校验的字段”>
<field-validator type=”使用校验器名称” short-circuit=”true”>
<param name=”参数名”>参数值</param>
<message key=”国际化资源key”>错误提示</message>
</field-validator>
</field>
</validators>
非字段校验风格
<validators>
<validator type=”使用校验器名称” short-circuit=”true” >
<param name=”fieldname”>被校验字段</parma>
<param name=”参数名”>参数值</param>
<message key=”国际化资源key”>错误提示</message>
</validator>
</validators>
4.4校验规则文件搜索规则
在struts.xml里配置了多个Action,如第一个Action名是reguster,第二个是deleteuser这里如果要为deldteuser处理逻辑添加校验规则文件,只需要创建
<Action类名>-<处理Action名>-validation.xml例如
RegisterAction-deleteuser-validation.xml
五拦截器
所谓拦截就是动态的生成一个代理对象,而在这个代理对象中包含了对拦截器方法的调用。因此当调用该代理对象的方法同时,会调用拦截器中的方法,通过这样的方法就实现了动态调用拦截器方法的目的。
5.1自定义拦截器
5.1.1有两种实现方式第一是直接实现Interceptor接口,第二是实现其子类AbstractInterceptor
5.1.2配置拦截器
只需在struts.xml里配置如
<interceptors>
<interceptor name=”拦截器名称” class=”拦截器实现类”>
<param name=”参数名”>参数值</param>
</interceptor>
</interceptors>
还要在strus.xml的backage外引用<interceptor-ref name=”拦截器名称”></interceptor-ref>
当有多个拦截器的时候可以配置成拦截器栈
<interceptors>
<interceptor name=”拦截器名称一” class=”拦截器实现类”>
<param name=”参数名”>参数值</param>
</interceptor>
<interceptor name=”拦截器名称二” class=”拦截器实现类”>
<param name=”参数名”>参数值</param>
</interceptor>
</interceptor-stack name=”拦截器栈”>
<interceptor-ref name=”拦截器名称一”>
<interceptor-ref name=”拦截器名称二”>
</interceptor-stack>
</interceptors>
5.1.3默认拦截器
默认拦截器包含了系统提供的拦截器当使用了自定义拦截器还要想使用系统提供的拦截器的话,就要在struts.xml里配置
<interceptor-ref name=”defaultStack”></interceptor-ref>
5.2.1深入拦截器
传递参数的例子
MyInterceptor.Java
package net.hncu.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor{
//拦截器的名称
private String interceptorName;
public void setInterceptorName(String interceptorName) {
this.interceptorName = interceptorName;
}
//实现拦截的方法
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println(interceptorName + ":拦截前操作");
String result = invocation.invoke();
System.out.println(interceptorName + ":拦截后操作");
return result;
}
}
在struts.xml里配置
<interceptors>
<!-- 配置myInter拦截器,并制定该拦截器实现类 -->
<interceptor name="myInter3" class="net.hncu.interceptor.MyInterceptor3">
<param name="interceptorName">过滤拦截器</param>
</interceptor>
覆盖拦截器栈中指定拦截器的参数
在引用拦截器的时候又传参
<interceptor-ref name=”拦截器名称”>
<param name=”拦截器名称.interceptorName”>参数</param>
<、interceptor-ref >
拦截器的使用流程
拦截器一》拦截器二》Action》拦截器二》拦截器一
5.3.1方法过滤
这个是过滤某个方法
必须继承MethodFilterInterceptor类
package net.hncu.interceptor;
import net.hncu.listener.MyListener;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor{
//拦截器的名称
private String interceptorName;
public void setInterceptorName(String interceptorName) {
this.interceptorName = interceptorName;
}
//实现拦截的方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new MyListener());
System.out.println(interceptorName + ":-----拦截前操作-----");
String result = invocation.invoke();
System.out.println(interceptorName + ":------拦截后操作------");
return result;
}
}
在struts.xml里配置
<!-- 使用myInterStack拦截器栈 -->
<interceptor-ref name="myInterStack">
<param name="myInter3.includeMethods">execute</param>
<param name="myInter3.excludeMethods">execute</param>
</interceptor-ref>
includeMethods()方法设置了不需要拦截的方法,excludeMethods()方法设置了需要拦截的方法,当两个方法同时设置了一个方法时以includeMethods()方法为准
5.4.1拦截结果监听器
package net.hncu.listener;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener;
public class MyListener implements PreResultListener{
public void beforeResult(ActionInvocation invocation, String resultCode) {
System.out.println("返回逻辑视图名" + resultCode);
}
}
package net.hncu.interceptor;
import net.hncu.listener.MyListener;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor{
//拦截器的名称
private String interceptorName;
public void setInterceptorName(String interceptorName) {
this.interceptorName = interceptorName;
}
//实现拦截的方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new MyListener());
System.out.println(interceptorName + ":-----拦截前操作-----");
String result = invocation.invoke();
System.out.println(interceptorName + ":------拦截后操作------");
return result;
}
}
分享到:
相关推荐
根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...
在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...
Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...
张龙圣思园的Struts2学习笔记,无疑为Java开发者提供了一份宝贵的参考资料,它可能涵盖了Struts2的基础概念、核心组件、配置方式以及实战技巧。 首先,让我们深入了解Struts2的核心特性。Struts2是MVC(Model-View-...
本笔记将全面总结Struts2的核心概念、主要功能以及实际开发中的应用。 一、Struts2概述 Struts2是Apache软件基金会下的一个开源项目,它继承了Struts1的优点并解决了其存在的问题,如性能和灵活性。Struts2的核心是...