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学习总结二

这次主要说:

  1. 请求封装参数
  2. 几个域的获取(涉及到值栈问题,写如何获取,具体原理后面说明)
  3. 强制类型转换
  4. 拦截器
  5. form表单验证

1、请求封装参数

有以下三种封装形式:

  1. 动作类(action)为实体模型。
  2. 动作类和实体模型分开。
  3. 模型驱动
    1. 单独模型驱动
    2. 模型驱动和动作类一起使用
    3. 值栈的问题(放到后面说明,这里就写一个demo)

1.1、动作类作为实体模型

做如下几件事情:

  1. 创建UserAction类,并且继承ActionSupport类。
  2. 创建struts.xml,并编写。
  3. 编写web.xml。
  4. 编写2个jsp。
  5. 访问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、动作类和实体模型分开

需要做的就几件事情:

  1. 编写User类。
  2. 编写UserAction并继承ActionSupport类。
  3. 编写struts.xml
  4. 编写web.xml
  5. 更改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、模型驱动

分三部分说明:

  1. 单独使用模型驱动。
  2. 模型驱动和动作类一起使用。
  3. ajax返回json数据问题。(这个就是值栈的问题)
1.3.1、模型驱动单独使用

分几步走:

  1. 创建User类。
  2. 创建UserAction类并实现一个ModelDriven接口,其中泛型是User类。
  3. 编写struts.xml。
  4. 编写web.xml。
  5. 修改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、模型驱动和动作类一起使用

做两个例子:

  1. 参数不冲突。
  2. 参数冲突。

步骤:

  1. 编写User类。
  2. 编写UserAction类,并继承ActionSupport类和实现ModelDriven接口。
  3. 编写struts.xml。
  4. 编写web.xml。
  5. 修改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的一个例子(我认为很多人都应该碰到过)

需要做的事情:

  1. 编写User类。
  2. 编写UserAction类,并继承ActionSupport和实现ModelDriven接口。
  3. 修改struts.xml。
  4. 编写web.xml。
  5. 修改index.jsp,并编写ajax。
  6. 实验结果。
  7. 解决方案。

在开始之前需要导入一个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对象

  1. 在Action中获取request。
  2. 通过ServletActionContext类来获取。
  3. 通过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的格式。

需要做的事情:

  1. 创建User类。
  2. 创建UserAction并实现ModelDriven接口。
  3. 创建类型转换类,命名为DateConverter并继承StrutsTypeConverter类。
  4. 编写strtus.xml和web.xml。
  5. 编写index.jsp。
  6. 编写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,不像过滤器那么强大,什么都可以拦截。

几个内容:

  1. 登录验证拦截器。
  2. 默认的拦截器。
  3. 继承package的拦截器。

4.1、登录验证拦截器

下面几个步骤:

  1. 创建登录验证拦截器类。
  2. 创建UserAction类和User类。
  3. 创建struts.xml和web.xml。
  4. 编写index.jsp。
  5. 测试没有登录的情况访问不允许访问的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命名的两个点:

  1. 在Action包下创建ActionClassName-validation.xml,这是针对这个Action中的所有方法都验证!
  2. 在Action包下创建ActionClassName-ActionName-validation.xml,这是针对ActionName这个方法验证!

第5点的表单验证,我自己也没去玩过!都是直接用JavaScript和Action方法中的硬编码实现的。或者自定义一个工具类Utils,直接调用Utils的方法!


参考

黑马笔记,和百度了一些博客!

Struts2学习总结二相关推荐

  1. struts2学习笔记二--准备struts2的学习和开发环境

    准备struts2的学习和开发环境 1 导包 2 参照开发包自带的例子在web.xml文件中配置 3 参照开发包自带的例子编写Action类和配置struts.xml文件 <struts> ...

  2. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  3. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  4. Mybatis底层原理学习(二):从源码角度分析一次查询操作过程

    在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...

  5. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  6. Membership学习(二)membership入门

    Membership学习(二)membership入门 --不写一行代码在asp.net中实现用户验证管理系统 这篇文章我们将实现一个简单的网站,在网站中实现用户的身份验证,创建用户,修改密码 还有限 ...

  7. appium学习【二】:用try捕获异常后,用例的执行结果为pass

    appium学习[二]:用try捕获异常后,用例的执行结果为pass 参考文章: (1)appium学习[二]:用try捕获异常后,用例的执行结果为pass (2)https://www.cnblog ...

  8. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  9. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. 看直播拿证书 | 12 天,0 基础晋级 Serverless 高手
  2. 解决Ubuntu18.04下Qt中无法输入中文的问题
  3. C#LeetCode刷题-动态规划
  4. Linux内核网络协议栈8—socket监听
  5. java后台调用SOE时,报异常java.io.IOException: Attempted read from closed stream
  6. 10月1日 记录下os.path.dirname(__file__)使用
  7. 调试内核Ubuntu 搭建嵌入式开发环境-续
  8. linux下简单好用的端口映射转发工具rinetd
  9. python排版word文档 效率_5秒搞定Word排版,效率颠覆你的想象!
  10. 关于电的计算机公式,电功率计算公式大全
  11. 文本相似度算法对比分析,短文本相似度主流算法
  12. 虚拟机的三种网络连接方式
  13. PHP攻防安全相关 -- 转
  14. Xmanager中的Xbrowser怎么使用?
  15. ecshop判断是手机访问还是web访问
  16. MySQL报错:Data too long for column
  17. 太阳能热水器工作原理
  18. 个人/团队/企业/组织申请计算机软件著作权的流程
  19. Ansible批量管理Windows服务器,winrm配置
  20. 据说vite还是有坑,不行,那就还用vue-cli吧,命令vue create gua12,记一下,可能过一个星期不看,又忘了

热门文章

  1. NYOJ 36 最长公共子序列
  2. NYOJ 467 中缀式变后缀式
  3. Intellij IDEA 4种配置热部署的方法【转】【补】
  4. 使用正則表達式对URL进行解析
  5. 轻松玩转jquery。
  6. 判断字符串NSString是否是整形或者浮点型
  7. linux 下启动jar小程序
  8. 组合模式(Composition)
  9. Codeblocks 安装
  10. LINUX下的文件结构介绍