Struts2学习总结二
Struts2框架学习
- Struts2学习总结二
- 1、请求封装参数
- 1.1、动作类作为实体模型
- 1.1.1、创建UserAction类
- 1.1.2、创建struts.xml并编写
- 1.1.3、编写web.xml
- 1.1.4、2个.jsp文件
- 1.1.5、测试
- 1.2、动作类和实体模型分开
- 1.1.1、编写User类
- 1.2.2、编写UserAction类
- 1.2.3、编写struts.xml
- 1.2.4、编写web.xml
- 1.2.5、修改index.jsp内容
- 1.2.6、测试结果
- 1.2.7、原理
- 1.3、模型驱动
- 1.3.1、模型驱动单独使用
- 1.3.1.1、创建User类
- 1.3.1.2、创建UserAction并实现ModelDriven接口
- 1.3.1.3、编写struts.xml
- 1.3.1.4、编写web.xml
- 1.3.1.5、修改index.jsp
- 1.3.1.6、测试
- 1.3.1.7、原理
- 1.3.2、模型驱动和动作类一起使用
- 1.3.2.1、编写User类
- 1.3.2.2、编写UserAction类
- 1.3.2.3、编写struts.xml
- 1.3.2.4、编写web.xml
- 1.3.2.5、修改index.jsp
- 1.3.2.6、测试
- 1.3.2.7、原理
- 1.3.3、ajax的一个例子(我认为很多人都应该碰到过)
- 1.3.3.1、编写User类
- 1.3.3.2、编写UserAction类,并继承...
- 1.3.3.3、修改struts.xml
- 1.3.3.4、编写web.xml
- 1.3.3.5、修改index.jsp并编写ajax
- 1.3.3.6、实验结果
- 1.3.3.7、解决方案
- 2、几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
- 2.1、在Action中获取request
- 2.2、通过ServletActionContext类来获取
- 2.3、通过ServletRequestAware接口来获取
- 3、强制类型转换
- 3.1、一个日期转换的例子
- 3.1.1、创建User类
- 3.1.2、创建UserAction类
- 3.1.3、创建DateConverter并继承StrutsTypeConverter类
- 3.1.4、编写strtus.xml和web.xml
- 3.1.5、编写index.jsp
- 3.1.6、编写javabean名称-conversion.properties文件
- 3.1.6、测试结果
- 3.2、全局配置文件与局部配置文件
- 4、拦截器
- 4.1、登录验证拦截器
- 4.1.1、创建登录验证拦截器类
- 4.1.2、创建UserAction类和User类
- 4.1.3、创建struts.xml和web.xml
- 4.1.4、编写index.jsp
- 4.1.5、测试没有登录的情况访问不允许访问的action
- 4.2、默认的拦截器
- 4.3、继承package的拦截器
- 5、form表单验证(声明式验证)
- 第5点的表单验证,我自己也没去玩过!都是直接用JavaScript和Action方法中的硬编码实现的。或者自定义一个工具类Utils,直接调用Utils的方法!
- 参考
Struts2学习总结二
这次主要说:
- 请求封装参数
- 几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
- 强制类型转换
- 拦截器
- form表单验证
1、请求封装参数
有以下三种封装形式:
- 动作类(action)为实体模型。
- 动作类和实体模型分开。
- 模型驱动
- 单独模型驱动
- 模型驱动和动作类一起使用
- 值栈的问题(放到后面说明,这里就写一个demo)
1.1、动作类作为实体模型
做如下几件事情:
- 创建UserAction类,并且继承ActionSupport类。
- 创建struts.xml,并编写。
- 编写web.xml。
- 编写2个jsp。
- 访问
http://ip:port/webapps/namespace/actionName.action
。
1.1.1、创建UserAction类
package com.csa.action;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String password;public String login() {System.out.println("姓名:"+username+"\r\n密码:"+password);return SUCCESS;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
1.1.2、创建struts.xml并编写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="struts-default" namespace="/user"><action name="*" class="com.csa.action.UserAction" method="{1}"><result name="success">/success.jsp</result></action></package></struts>
1.1.3、编写web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- 配置struts2过滤器 --><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></web-app>
1.1.4、2个.jsp文件
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/><input type="submit" value="login"/></form></body>
</html>
success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录成功</title></head><body><h1>登录成功</h1></body>
</html>
1.1.5、测试
访问:
结果:
传递参数原理:
需要编写相应的setter方法。
1.2、动作类和实体模型分开
需要做的就几件事情:
- 编写User类。
- 编写UserAction并继承ActionSupport类。
- 编写struts.xml
- 编写web.xml
- 更改index.jsp的内容
1.1.1、编写User类
package com.csa.domain;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password + "]";}
}
1.2.2、编写UserAction类
注意,并不需要new
一个User对象
。
package com.csa.action;import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private User user;public String login() {System.out.println(user);return SUCCESS;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
1.2.3、编写struts.xml
与上一个的一样,没有任何改变!
1.2.4、编写web.xml
也没有变化!
1.2.5、修改index.jsp内容
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="user.username"/><br/>密码:<input type="text" name="user.password"/><br/><input type="submit" value="login"/></form></body>
</html>
1.2.6、测试结果
1.2.7、原理
有点类似与对象名.属性=输入的值
。
1.3、模型驱动
分三部分说明:
- 单独使用模型驱动。
- 模型驱动和动作类一起使用。
- ajax返回json数据问题。(这个就是值栈的问题)
1.3.1、模型驱动单独使用
分几步走:
- 创建User类。
- 创建UserAction类并实现一个ModelDriven接口,其中泛型是User类。
- 编写struts.xml。
- 编写web.xml。
- 修改index.jsp。
1.3.1.1、创建User类
没有改变。
1.3.1.2、创建UserAction并实现ModelDriven接口
注意,这里需要new User()
。
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;public class UserAction implements ModelDriven<User> {private User user = new User();public String login() {System.out.println(user);return "success";}@Overridepublic User getModel() {return user;}}
1.3.1.3、编写struts.xml
没有改变。
1.3.1.4、编写web.xml
没有改变。
1.3.1.5、修改index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/><input type="submit" value="login"/></form></body>
</html>
1.3.1.6、测试
1.3.1.7、原理
说实话,这个原理我也不太知道!简单的认为它是前面两个的结合吧!
1.3.2、模型驱动和动作类一起使用
做两个例子:
- 参数不冲突。
- 参数冲突。
步骤:
- 编写User类。
- 编写UserAction类,并继承ActionSupport类和实现ModelDriven接口。
- 编写struts.xml。
- 编写web.xml。
- 修改index.jsp。
1.3.2.1、编写User类
没变!
1.3.2.2、编写UserAction类
第一个例子的编写:
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public class UserAction extends ActionSupport implements ModelDriven<User> {private User user = new User();private String phone;public String login() {System.out.println(user);return "success";}@Overridepublic User getModel() {return user;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}
第二个例子的编写:
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public class UserAction extends ActionSupport implements ModelDriven<User> {private User user = new User();private String username;public String login() {System.out.println(user);System.out.println("username:"+username);return "success";}@Overridepublic User getModel() {return user;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}
1.3.2.3、编写struts.xml
没变!
1.3.2.4、编写web.xml
没变!
1.3.2.5、修改index.jsp
第一个例子的编写:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/>电话:<input type="text" name="phone"/><br/><input type="submit" value="login"/></form></body>
</html>
第二个例子的编写:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/><input type="submit" value="login"/></form></body>
</html>
1.3.2.6、测试
第一个例子的结果:
第二个例子的结果:
1.3.2.7、原理
这个我也不太清楚,只知道两个同时用的时候千万别参数名一直!
1.3.3、ajax的一个例子(我认为很多人都应该碰到过)
需要做的事情:
- 编写User类。
- 编写UserAction类,并继承ActionSupport和实现ModelDriven接口。
- 修改struts.xml。
- 编写web.xml。
- 修改index.jsp,并编写ajax。
- 实验结果。
- 解决方案。
在开始之前需要导入一个jar包。
1.3.3.1、编写User类
没变!
1.3.3.2、编写UserAction类,并继承…
package com.csa.action;
import java.util.Map;import com.csa.domain.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public class UserAction extends ActionSupport implements ModelDriven<User> {private User user = new User();private String phone;public String login() {System.out.println(user);System.out.println("phone:"+phone);return "success";}@Overridepublic User getModel() {return user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}
1.3.3.3、修改struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="json-default" namespace="/user"><action name="*" class="com.csa.action.UserAction" method="{1}"><result name="success" type="json"></result></action></package></struts>
1.3.3.4、编写web.xml
没变!
1.3.3.5、修改index.jsp并编写ajax
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><title>登录页面</title><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script>function submitForm() {$.ajax({url:"${pageContext.request.contextPath}/user/login.action",type:"get",data:$("#loginId").serialize(),success:function(result){console.log(result);}});}</script></head><body><form id="loginId">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/>电话:<input type="text" name="phone"/><br/><input type="button" onclick="submitForm();" value="login"/></form></body>
</html>
1.3.3.6、实验结果
发现,并没有得到phone
的值,而且只得到了user的两个参数值,并不是user包含着两个参数的。怎么回事呢?按道理应该放回所有参数才对!
1.3.3.7、解决方案
修改UserAction代码:
package com.csa.action;
import java.util.HashMap;
import java.util.Map;import com.csa.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public class UserAction extends ActionSupport implements ModelDriven<User> {private User user = new User();private String phone;public String login() {System.out.println(user);System.out.println("phone:"+phone);Map<String,Object> json = new HashMap<>();json.put("user", user);json.put("phone", phone);ActionContext.getContext().getValueStack().push(json);return "success";}@Overridepublic User getModel() {return user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}
实验结果:
2、几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC(控制反转)机制注入Request对象。
- 在Action中获取request。
- 通过ServletActionContext类来获取。
- 通过ServletRequestAware接口通过IOC机制注入Request对象。
2.1、在Action中获取request
Map request = (Map)ActionContext.getContext().get("request");
2.2、通过ServletActionContext类来获取
HttpServletRequest request = ServletActionContext.getRequest();
2.3、通过ServletRequestAware接口来获取
public class 类名 implements ServletRequestAware {private HttpServletRequest request;//实现接口中的方法public void setServletRequest(HttpServletRequest request){this.request = request;}
}
其他域的对象同理!
3、强制类型转换
实际开发中用户通过浏览器输入的数据都是String或者String[]。当为数组的时候,将用,
隔开。
3.1、一个日期转换的例子
我们现在知道,在前端输入一个以字符串为值的日期形式,只能收取格式为yyyy-MM-dd
,其他格式将会报错。
我们将改进这个,使得前端不仅仅可以收取格式为yyyy-MM-dd
的,还可以是yyyy/MM/dd
的格式。
需要做的事情:
- 创建User类。
- 创建UserAction并实现ModelDriven接口。
- 创建类型转换类,命名为DateConverter并继承StrutsTypeConverter类。
- 编写strtus.xml和web.xml。
- 编写index.jsp。
- 编写javabean名称-conversion.properties文件。
3.1.1、创建User类
package com.csa.domain;import java.util.Date;public class User {private String username;private String password;private Date birthday;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password + ", birthday=" + birthday + "]";}
}
3.1.2、创建UserAction类
package com.csa.action;
import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;public class UserAction implements ModelDriven<User> {private User user = new User();public String register() {System.out.println(user);return "success";}@Overridepublic User getModel() {return user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
3.1.3、创建DateConverter并继承StrutsTypeConverter类
package com.csa.converter;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;public class DateConverter extends StrutsTypeConverter {private DateFormat df1 = new SimpleDateFormat("yyyy/MM/dd");private DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {//1. 判断输入进来的值是否为空if(values==null||values.length==0) {return null;}//2. 取出要转换的元素String date = values[0];//3. 判断是否为要转换的那个类型if(toClass==java.util.Date.class) {//4. 按照定义的格式来解析try {if(date.indexOf("/")!=-1) {System.out.println(1);return df1.parse(date);}else if(date.indexOf("-")!=-1) {System.out.println(2);return df2.parse(date);}else {return null;}} catch(Exception e) {System.out.println(e.getMessage());return null;}}return null;}@Overridepublic String convertToString(Map context, Object o) {//判断object对象是否日期对象if(o instanceof java.util.Date) {Date date = (Date)o;return df1.format(date);}return null;}}
3.1.4、编写strtus.xml和web.xml
编写struts.xml,web.xml没变:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="json-default" namespace="/user"><action name="*" class="com.csa.action.UserAction" method="{1}"><result name="success">/success.jsp</result></action></package></struts>
3.1.5、编写index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><title>注册页面</title></head><body><form action="${pageContext.request.contextPath}/user/register.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/>生日:<input type="text" name="birthday"/><br/><input type="submit" value="register"/></form></body>
</html>
3.1.6、编写javabean名称-conversion.properties文件
User-conversion.properties文件内容:
birthday = com.csa.converter.DateConverter
3.1.6、测试结果
3.2、全局配置文件与局部配置文件
刚刚例子中,全局配置文件并没有说明,当时你也许已经知道局部配置文件是谁了!没错,User-conversion.properties
是局部配置文件。
全局配置文件(放在src下,名字固定为"xwork-conversion.properties"):
针对于这个例子的文件内容为:
java.util.Date = com.csa.converter.DateConverter
局部优先!
4、拦截器
说到拦截器,举一个登录的例子就行了。
注意,拦截器只能拦截Action,不像过滤器那么强大,什么都可以拦截。
几个内容:
- 登录验证拦截器。
- 默认的拦截器。
- 继承package的拦截器。
4.1、登录验证拦截器
下面几个步骤:
- 创建登录验证拦截器类。
- 创建UserAction类和User类。
- 创建struts.xml和web.xml。
- 编写index.jsp。
- 测试没有登录的情况访问不允许访问的action。
4.1.1、创建登录验证拦截器类
需要继承一个MethodFilterIntercpteor抽象类!虽然其他的也可以,但是我们一般继承这个类!不过需要注意的是,在这个例子里面只能继承这个类,否则需要做的事情还有很多!
package com.csa.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;public class LoginCheck extends MethodFilterInterceptor {@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception {Map<String,Object> session = ActionContext.getContext().getSession();//如果登录了,那么就有session保存user对象。if(session.get("user")!=null) {return invocation.invoke();}else {//还记得一开始我们struts拦截器部分会返回一个String结果字符串吗?这个其实就是结果视图!return "error";}}}
4.1.2、创建UserAction类和User类
package com.csa.action;
import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.csa.domain.User;
import com.opensymphony.xwork2.ModelDriven;public class UserAction implements ModelDriven<User>,SessionAware {private User user = new User();private Map<String,Object> session;public String login() {session.put("user", user);return "success";}/*** 只有登录成功后才能被访问* @return*/public String success() {return "success";}@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic User getModel() {return user;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
package com.csa.domain;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}
4.1.3、创建struts.xml和web.xml
web.xml没变,下面是struts.xml的编写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="json-default" namespace="/user"><!-- 定义拦截器 --><interceptors><interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck"></interceptor></interceptors><!-- 全局视图 --><global-results><result name="error">/error.jsp</result></global-results><action name="*" class="com.csa.action.UserAction" method="{1}"><!-- 使用我们定义的拦截器 --><interceptor-ref name="loginCheck"><!-- 不写下面这个参数默认拦截所有方法,写,则说明不拦截某个方法。如果有多个方法则用","分开比如:login,register,...--><param name="excludeMethods">login</param><!-- 还有可以参数是:includeMethods,作用相反,这个是哪些方法被拦截! --><!-- <param name="includeMethods">login,register</param>这样子,login和register方法将被拦截!--></interceptor-ref><!-- 注意,这里如果使用了自定义的拦截器,那默认拦截器将会被取消,所以我们要再加上一个默认拦截器 --><interceptor-ref name="defaultStack"></interceptor-ref><result name="success">/success.jsp</result></action></package></struts>
还有另外一种版本(与上面的等价):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="json-default" namespace="/user"><!-- 定义拦截器 --><interceptors><interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck"><param name="excludeMethods">login</param></interceptor><!-- 定义拦截器栈 --><interceptor-stack name="loginStack"><interceptor-ref name="loginCheck"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 全局视图 --><global-results><result name="error">/error.jsp</result></global-results><action name="*" class="com.csa.action.UserAction" method="{1}"><!-- 注意这里引用的是拦截器栈! --><interceptor-ref name="loginStack"></interceptor-ref><result name="success">/success.jsp</result></action></package></struts>
4.1.4、编写index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><title>登录页面</title></head><body><form action="${pageContext.request.contextPath}/user/login.action">用户名:<input type="text" name="username"/><br/>密码:<input type="text" name="password"/><br/><input type="submit" value="register"/></form></body>
</html>
4.1.5、测试没有登录的情况访问不允许访问的action
登录情况下:
4.2、默认的拦截器
编写struts.xml文件内容(default-interceptor-ref元素):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 配置说明省略 --><package name="user" extends="json-default" namespace="/user"><!-- 定义拦截器 --><interceptors><interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck"><param name="excludeMethods">login</param></interceptor><!-- 定义拦截器栈 --><interceptor-stack name="loginStack"><interceptor-ref name="loginCheck"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 直接引用拦截器栈,从而下面的action中我们就不需要定义了 --><default-interceptor-ref name="loginStack"></default-interceptor-ref><!-- 全局视图 --><global-results><result name="error">/error.jsp</result></global-results><action name="*" class="com.csa.action.UserAction" method="{1}"><result name="success">/success.jsp</result></action></package></struts>
4.3、继承package的拦截器
需要做的事情:定义两个包,有继承关系!讲这个只是为了一件事情,很多操作必须在登录的条件下才能进行!
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts><!-- 开发模式 --><constant name="struts.devMode" value="true"></constant><!-- 基类名字为base,继承json-default,命名空间并不会影响到继承的interceptors元素default..等等这些东西 --><package name="base" extends="json-default" namespace="/"><!-- 定义拦截器 --><interceptors><interceptor name="loginCheck" class="com.csa.interceptor.LoginCheck"><param name="excludeMethods">login</param></interceptor><!-- 定义拦截器栈 --><interceptor-stack name="loginStack"><interceptor-ref name="loginCheck"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 直接引用拦截器栈,从而下面的action中我们就不需要定义了 --><default-interceptor-ref name="loginStack"></default-interceptor-ref><!-- 全局视图 --><global-results><result name="success">/success.jsp</result><result name="error">/error.jsp</result></global-results></package><!-- user继承base,将里面的所有元素全部继承,并不影响子类编写自己的元素! --><package name="user" extends="base" namespace="/user"><action name="*" class="com.csa.action.UserAction" method="{1}"></action></package></struts>
测试是否正确的结果(从下面就可以看出,已经全被继承成功了):
5、form表单验证(声明式验证)
直接看别人博客吧!这个太多了。
注意-validation.xml命名的两个点:
- 在Action包下创建ActionClassName-validation.xml,这是针对这个Action中的所有方法都验证!
- 在Action包下创建ActionClassName-ActionName-validation.xml,这是针对ActionName这个方法验证!
第5点的表单验证,我自己也没去玩过!都是直接用JavaScript和Action方法中的硬编码实现的。或者自定义一个工具类Utils,直接调用Utils的方法!
参考
黑马笔记,和百度了一些博客!
Struts2学习总结二相关推荐
- struts2学习笔记二--准备struts2的学习和开发环境
准备struts2的学习和开发环境 1 导包 2 参照开发包自带的例子在web.xml文件中配置 3 参照开发包自带的例子编写Action类和配置struts.xml文件 <struts> ...
- 语义分割:基于openCV和深度学习(二)
语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- Mybatis底层原理学习(二):从源码角度分析一次查询操作过程
在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- Membership学习(二)membership入门
Membership学习(二)membership入门 --不写一行代码在asp.net中实现用户验证管理系统 这篇文章我们将实现一个简单的网站,在网站中实现用户的身份验证,创建用户,修改密码 还有限 ...
- appium学习【二】:用try捕获异常后,用例的执行结果为pass
appium学习[二]:用try捕获异常后,用例的执行结果为pass 参考文章: (1)appium学习[二]:用try捕获异常后,用例的执行结果为pass (2)https://www.cnblog ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
最新文章
- 看直播拿证书 | 12 天,0 基础晋级 Serverless 高手
- 解决Ubuntu18.04下Qt中无法输入中文的问题
- C#LeetCode刷题-动态规划
- Linux内核网络协议栈8—socket监听
- java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
- 10月1日 记录下os.path.dirname(__file__)使用
- 调试内核Ubuntu 搭建嵌入式开发环境-续
- linux下简单好用的端口映射转发工具rinetd
- python排版word文档 效率_5秒搞定Word排版,效率颠覆你的想象!
- 关于电的计算机公式,电功率计算公式大全
- 文本相似度算法对比分析,短文本相似度主流算法
- 虚拟机的三种网络连接方式
- PHP攻防安全相关 -- 转
- Xmanager中的Xbrowser怎么使用?
- ecshop判断是手机访问还是web访问
- MySQL报错:Data too long for column
- 太阳能热水器工作原理
- 个人/团队/企业/组织申请计算机软件著作权的流程
- Ansible批量管理Windows服务器,winrm配置
- 据说vite还是有坑,不行,那就还用vue-cli吧,命令vue create gua12,记一下,可能过一个星期不看,又忘了