zoukankan      html  css  js  c++  java
  • Struts2基础-3 -继承ActionSupport接口创建Action控制器+javaBean接收请求参数+ 默认Action配置处理请求错误 + 使用ActionContext访问ServletAPI

    1.目录结构及导入的jar包

    2.web.xml 配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     6     <welcome-file-list>
     7         <welcome-file>index.jsp</welcome-file>
     8     </welcome-file-list>
     9 
    10     <filter>
    11         <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
    12         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    13     </filter>
    14 
    15     <filter-mapping>
    16         <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
    17         <url-pattern>/*</url-pattern>
    18     </filter-mapping>
    19 
    20 </web-app>

    2.Action类编写

    User JavaBean定义

     1 package cn.test.entity;
     2 
     3 public class User {
     4 
     5     private String name;
     6     private String age;
     7     private String password;
     8 
     9     public String getAge() {
    10         return age;
    11     }
    12 
    13     public void setAge(String age) {
    14         this.age = age;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24     
    25 
    26     public String getPassword() {
    27         return password;
    28     }
    29 
    30     public void setPassword(String password) {
    31         this.password = password;
    32     }
    33 
    34     @Override
    35     public String toString() {
    36         return "User [age=" + age + ", name=" + name + ", password=" + password
    37                 + "]";
    38     }
    39 
    40 }

    通过继承ActionSupport类创建 Action控制器:

    (1)不管是通过Javabean 还是直接通过属性字段获取请求数据,都需要在Action类设置setter getter方法

    (2)ActionSupport类实现了Action接口,所以此处可以选择重写execute() 方法,处理请求

    (3)此处通过ActionContext类访问Servlet API,获取session对象

     1 package cn.test.action;
     2 
     3 import cn.test.entity.User;
     4 
     5 import com.opensymphony.xwork2.Action;
     6 import com.opensymphony.xwork2.ActionContext;
     7 import com.opensymphony.xwork2.ActionSupport;
     8 
     9 /**
    10  * Action处理请求参数-属性驱动 strtus2中页面的请求数据和Action有两种基本的对应方式,分别是字段驱动和模型驱动方式。字段驱动也叫属性驱动
    11  * 属性驱动是指通字段进行数据传递,包括:与基本数据类型的属性对应,直接使用域对象(也就是javaBean)
    12  * 
    13  * @author Administrator
    14  * 
    15  */
    16 public class UserLoginAction extends ActionSupport {
    17 
    18     private static final long serialVersionUID = 1L;
    19     private User user;// 通过javaBean获取前端传递的数据;必须设置getter setter方法
    20 
    21     public User getUser() {
    22         return user;
    23     }
    24 
    25     public void setUser(User user) {
    26         this.user = user;
    27     }
    28 
    29     @Override
    30     public String execute() throws Exception {   //继承ActionSupport接口的Action类中,必须要有重写的execute方法
    31         //获取Context对象: 通过ActionContext类访问Servlet API
    32         ActionContext context = ActionContext.getContext();
    33         if("admin".equals(user.getName()) && "123".equals(user.getPassword())){
    34             //把用户名和密码放到session中
    35             context.getSession().put("username", user.getName());
    36             context.getSession().put("password", user.getPassword());
    37             return Action.SUCCESS;
    38         } else {
    39             context.getSession().put("error", "用户登陆失败");
    40             return ERROR;//Action接口中定义的常量
    41         }
    42         
    43     }
    44 
    45     
    46 
    47 }

    3. struts.xml中 action的配置

    当Action类返回“success”逻辑视图名,请求转发到loginSuccess.jsp 页面,当返回error 逻辑视图名,请求转发到 loginError.jsp 页面。

    红色部分是配置了一个默认的action,当请求一个不存在的action时,一般页面会报404 not found,当我们配置默认的action,如果请求一个不存在的aciton时,页面就会跳转到

    我们指定的错误页面,而不是提示404, 此处跳转到error.jsp 页面

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 <struts>
     6     <!-- 开启动态调用,并且设置启用开发者模式 -->
     7     <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
     8     <constant name="struts.devMode" value="true"></constant>
     9 
    10     <!-- 配置默认的action,当请求一个不存在的Action,将跳转到error.jsp页面-->
    11     <package name="default" namespace="/user" extends="struts-default">
    12         <default-action-ref name="defaultAction"></default-action-ref>
    13         <action name="defaultAction">
    14             <result>/error.jsp</result>
    15         </action>
    16     </package>
    17 
    18     <package name="user" namespace="/user" extends="struts-default">
    19         <action name="userLogin" class="cn.test.action.UserLoginAction">
    20             <result name="success">/loginSuccess.jsp</result>
    21             <result name="error">/loginError.jsp</result>
    22         </action>
    23     </package>
    24 </struts>

    4. JSP页面编写

    登录页面userLogin.jsp(浏览器直接请求该页面,进入到登陆页面):

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 
     8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     9 <html>
    10   <head>
    11     <base href="<%=basePath%>">
    12     <title>userLogin page</title>
    13     </head>
    14   <body>
    15     <div style="margin:10px;padding:10px">
    16         <form name="fomr1" action="<%=basePath%>user/userLogin.action" method="post">
    17             用户名:<input type="text" name="user.name" /><br/>
    18             密码: <input type="password" name="user.password" /><br/>
    19             <input type="submit" value="登陆" />
    20         </form>
    21     </div>
    22   </body>
    23 </html>

    登陆成功页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="/struts-tags" prefix="s"%>
     3 <%
     4     String path = request.getContextPath();
     5     String basePath = request.getScheme() + "://"
     6             + request.getServerName() + ":" + request.getServerPort()
     7             + path + "/";
     8 %>
     9 
    10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    11 <html>
    12     <head>
    13         <base href="<%=basePath%>">
    14         <title>My JSP 'success.jsp' starting page</title>
    15     </head>
    16 
    17     <body> 
    18         登陆成功,session中的登陆用户名是:<%=request.getAttribute("user.name") %><br>
    19         <!--<s:property value="name"/> value里面写上Action类中定义的属性,就能在jsp页面显示请求中所带的参数了  -->
    20         采用OGNL与Struts2标签输出Action类的属性值(Action类获取到的请求参数值) <br/>
    21         name=<s:property value="user.name" />&nbsp;&nbsp; password=<s:property value="user.password" />    <br>
    22         采用EL表达式 输出Action类的属性值(${对象名.属性名 }):<br>
    23         name=${user.name }
    24     </body> 
    25 </html>

    登陆失败页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="/struts-tags" prefix="s"%>
     3 <%
     4     String path = request.getContextPath();
     5     String basePath = request.getScheme() + "://"
     6             + request.getServerName() + ":" + request.getServerPort()
     7             + path + "/";
     8 %>
     9 
    10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    11 <html>
    12     <head>
    13         <base href="<%=basePath%>">
    14         <title>登陆失败页面</title>
    15     </head>
    16 
    17     <body>
    18         控制器返回的错误信息为:${error };<br>
    19         <a href="userLogin.jsp">单击链接返回登陆页面</a>
    20     </body>
    21 </html>

    默认Action指定的跳转页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <%
     3     String path = request.getContextPath();
     4     String basePath = request.getScheme() + "://"
     5             + request.getServerName() + ":" + request.getServerPort()
     6             + path + "/";
     7 %>
     8 
     9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    10 <html>
    11     <head>
    12         <base href="<%=basePath%>">
    13         <title>My JSP 'success.jsp' starting page</title>
    14     </head>
    15     <body>
    16         真不巧,您访问的页面走丢了<br>
    17         <a href="userLogin.jsp">单击链接返回登陆页面</a>
    18     </body>
    19 </html>

    部署测试:

    (1)输入一个访问不到的请求:http://localhost:8080/strutsstu3/user/userLogi ,此时处理请求的是默认Action 

    (2) 单击上一步的链接, 转到 http://localhost:8080/strutsstu3/userLogin.jsp  

    输入admin 和一个错误的密码,结果如下:

    单击链接返回登陆页,输入admin 和123 提交,结果如下

    注:

    (1)在使用Javabean属性方式传值时,如果JSP页面时负责取值的,那么取值的格式必须为“对象.属性名”;如果JSP页面时负责传值的,那么传值的格式可以为“对象.属性名”,也可以直接是“属性名”

    (2)Struts2的Action没有与ServletAPI发生耦合,但是web开发中经常会用到ServletAPI中的对象,如用户登陆成功,则应该将用户信息保存到HttpSession中,而最常用的ServletAPI就是HttpSession, HttpServletRequest、ServletContext这三个接口,Strtus2访问ServletAPI,可以分为2类:与Servlet API 解耦的访问方式和与servlet API耦合的访问方式。

    与Servlet API 解耦的访问方式:

    (a)使用ActionContext类获取Servlet 对象对用的Map对象

    例如:

    ActionContext context = ActionContext.getContext();

    Map request = (Map) context.get("request");//ActionContext类没有提供getRequest()这样的方法来获取HttpServletRequest对应的map对象,要想得到HttpServletRequest对象对应的map对象,需要为get()方法传递request参数

    context.put("username", "admin");    //放到request作用域,相当于ServletAPI中国年的HttpServletRequest的setAttribute()方法
    context.getSession().put("username", "admin");  // 把信息放到session作用域
    context.getApplication().put("username", "admin");  // 把信息放到Application 作用域

    (b) 实现特定接口获取Servlet API对象

     

    与Servlet API 耦合的访问方式:

    示例代码下载地址   https://github.com/liuch0228/Struts2SSH.git 

  • 相关阅读:
    四种PHP异步执行的常用方式
    PHP 多进程和多线程的优缺点
    试着用workerman开发一个在线聊天应用
    Python代码报错看不懂?记住这20个报错提示单词轻松解决bug
    PHP面试题大全(值得收藏)
    常见排序算法(三)
    常见排序算法(二)
    常见排序算法(一)
    NumPy 学习笔记(四)
    JavaScript 事件
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/8996233.html
Copyright © 2011-2022 走看看