SSH学习-Struts2中的session

Struts中也有session,跟其他框架类似,也需要用它保存用户信息,或者其他信息。学习发现,Struts2获取session有三种方式,下面引入登录的案例,分别使用三种方式验证用户名和密码信息。

Struts2获取session的三种方式

(1)使用工厂方法获取,使用ActionContext实现,session为Map<String,Object>类型

(2)使用注入方式获取session,session为Map<String,Object>类型

(3)使用ServletActionContext实现session,session为HttpSession

具体实现方式

(1)使用工厂方法获取

struts.xml中配置,其中首先进入登录页面,提交登录时,需要修改form表单的地址为/loginWithSession/loginWithFactorySession.action

<!--登录,使用session对登录信息进行验证  -->
  <package name="loginWithSession" namespace="/loginWithSession" extends="struts-default">
    <!-- 进入登录页面 -->
    <action name="toLogin">
      <result>
        /WEB-INF/loginWithSession.jsp
      </result>
    </action>
    <!-- 登录验证,使用工厂方法获取session -->
    <action name="loginWithFactorySession" class="com.boe.Filter.LoginWithSessionByFactory">
      <result name="success">
        /WEB-INF/ok.jsp
      </result>
      <result name="error">
        /WEB-INF/loginWithSession.jsp
      </result>
    </action>
  </package>

对应loginWithSession.jsp的内容:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Session验证-登录</title>
</head>
<body style="font-family:‘微软雅黑‘;font-size:20px;">
    <!-- 使用JSTL标签 -->
    <!-- 标签的作用主要用来产生字符串类型的-->
    <!-- 另外还有一个问题,如果在注释里写了c标签,不加引号,编译会提示标签未结束 -->
    <c:url var="url" value="/loginWithSession/loginWithFactorySession.action"></c:url>
    <form action="${url}" method="post"><!-- 使用url标签,路径会默认在前面加上项目名,否则action里写路径就需要加上项目名 -->
       <div>
         <!-- 登录不成功,返回提示信息 -->
         <h1>${message}</h1>
       </div>
       <div>
         <label>用户名:</label>
         <input type="text" name="user.username" /><!-- 使用域模型传递数据,需要写完成实体类.属性名 -->
       </div>
       <div>
         <label>密码:</label>
         <input type="password" name="user.password" />
       </div>
       <div>
         <input type="submit" value="登录" />
       </div>
    </form>
</body>
</html>

对应ok.jsp的内容:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>获取登录后结果</title>
</head>
<body style="font-family:‘微软雅黑‘;font-size:20px;">
     <h1>Hello Struts2</h1>
     <!-- 使用EL表达式从服务端获取数据 -->
     <h2>"Hello!" ${LoginSuccess},采用session验证</h2><!-- 直接使用session中的key -->
</body>
</html>

控制器LoginWithSessionByFactory中写法:

package com.boe.Filter;

import java.util.Map;

import com.boe.Entity.User;
import com.opensymphony.xwork2.ActionContext;

public class LoginWithSessionByFactory {
    //属性
    private User user;
    private String message;

    //使用工厂方法获取session
    ActionContext ctx=ActionContext.getContext();
    Map<String,Object> session=ctx.getSession();

    //session的get方法
    public Map<String, Object> getSession() {
        return session;
    }

    //user和message的get set方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    //默认execute方法
    public String execute() {
        System.out.println(user);
        //登录验证
        if(user.getUsername().equals("clyang")&&user.getPassword().equals("123")) {
            session.put("LoginSuccess", user.getUsername());
            return "success";
        }
        else {
            message="用户名或密码错误,请重新登录!";
            return "error";
        }
    }        

}

测试结果:

第一次登录密码12,是错误的密码,因此提示用户名和密码错误,第二次密码123正确,因此进入ok.jsp页面,并显示登录后用户名为clyang,说明session被工厂方法获取,并成功用于保存用户信息。

(2)使用注入的方式获取session

struts.xml中配置,跟上面类似,其中进入登录页面部分不需要修改,需要改动的是增加一个action,里面控制器使用注入的session,并且修改loginWithSession.jsp中action地址:

<!-- 登录验证,使用注入获取session -->
...其他省略,参考第一个配置,添加一个action即可

    <action name="login" class="com.boe.Filter.LoginWithSession">
      <result name="success">
        /WEB-INF/ok.jsp
      </result>
      <result name="error">
        /WEB-INF/loginWithSession.jsp
      </result>
    </action> 

修改loginWithSession.jsp中action地址:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Session验证-登录</title>
</head>
<body style="font-family:‘微软雅黑‘;font-size:20px;">
    <!-- 使用JSTL标签 -->
    <!-- 标签的作用主要用来产生字符串类型的-->
    <!-- 另外还有一个问题,如果在注释里写了c标签,不加引号,编译会提示标签未结束 -->
    <c:url var="url" value="/loginWithSession/login.action"></c:url>
    <form action="${url}" method="post"><!-- 使用url标签,路径会默认在前面加上项目名,否则action里写路径就需要加上项目名 -->
       <div>
         <!-- 登录不成功,返回提示信息 -->
         <h1>${message}</h1>
       </div>
       <div>
         <label>用户名:</label>
         <input type="text" name="user.username" /><!-- 使用域模型传递数据,需要写完成实体类.属性名 -->
       </div>
       <div>
         <label>密码:</label>
         <input type="password" name="user.password" />
       </div>
       <div>
         <input type="submit" value="登录" />
       </div>
    </form>
</body>
</html>

添加控制器LoginWithSession,其中实现类需要实现SessionAware接口,并需要实现接口方法setSession,但是后面统一get set方法设置后刚好有它,因此可以先不管报错提示实现未实现的方法,有get set方法后自然报错消失。

package com.boe.Filter;
/**
 * session验证用户信息
 * @author yangchaolin
 */

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.boe.Entity.User;

public class LoginWithSession implements SessionAware{

    //属性
    private User user;
    private Map<String,Object> session;
    private String message;

    //添加get set方法
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Map<String, Object> getSession() {
        return session;
    }

    //以下是get set得到的,也是SeesionAware接口方法
    public void setSession(Map<String, Object> session) {
                this.session=session;
    }

    //默认execute方法
    public String execute() {
        System.out.println(user);
        //登录验证
        if(user.getUsername().equals("clyang")&&user.getPassword().equals("123")) {
            session.put("LoginSuccess", user.getUsername());
            return "success";
        }
        else {
            message="用户名或密码错误,请重新登录!";
            return "error";
        }
    }

}

测试结果:

第一次登录密码12,是错误的密码,因此提示用户名和密码错误,第二次密码123正确,因此进入ok.jsp页面,并显示登录后用户名为clyang,说明session注入成功,并成功用于保存用户信息。

(3)使用ServletActionContext获取session

这种方法获取的session跟前面两种类型不一样,前者为Map,后者为HttpSession。因此控制器中不能使用put方法,需要改成相应的setAttribute方法。

struts.xml中的配置,添加一个action,专门对应最后一种方式,并修改loginWithSession.jsp的action地址,跟配置文件中一致。

<!-- 登录验证,使用ServletActionContext获取session -->
    <action name="loginWithSessionByServlet" class="com.boe.Filter.LoginWithSessionByServlet">
      <result name="success">
        /WEB-INF/ok.jsp
      </result>
      <result name="error">
        /WEB-INF/loginWithSession.jsp
      </result>
    </action>

修改loginWithSession.jsp中action地址:

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Session验证-登录</title>
</head>
<body style="font-family:‘微软雅黑‘;font-size:20px;">
    <!-- 使用JSTL标签 -->
    <!-- 标签的作用主要用来产生字符串类型的-->
    <!-- 另外还有一个问题,如果在注释里写了c标签,不加引号,编译会提示标签未结束 -->
    <c:url var="url" value="/loginWithSession/loginWithSessionByServlet.action"></c:url>
    <form action="${url}" method="post"><!-- 使用url标签,路径会默认在前面加上项目名,否则action里写路径就需要加上项目名 -->
       <div>
         <!-- 登录不成功,返回提示信息 -->
         <h1>${message}</h1>
       </div>
       <div>
         <label>用户名:</label>
         <input type="text" name="user.username" /><!-- 使用域模型传递数据,需要写完成实体类.属性名 -->
       </div>
       <div>
         <label>密码:</label>
         <input type="password" name="user.password" />
       </div>
       <div>
         <input type="submit" value="登录" />
       </div>
    </form>
</body>
</html>

添加控制器LoginWithSessionByServlet,其中注意session的类型是HttpSession。

package com.boe.Filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.boe.Entity.User;

public class LoginWithSessionByServlet {
    //属性
    private User user;
    private String message;

    //使用ServletActionContext获取session
    HttpServletRequest req=ServletActionContext.getRequest();
    HttpSession session=req.getSession();

    //session的get方法
    public HttpSession getSession() {
        return session;
    }

    //user和message的get set方法
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    //默认execute方法
    public String execute() {
        System.out.println(user);
        //登录验证
        if(user.getUsername().equals("clyang")&&user.getPassword().equals("123")) {
            session.setAttribute("LoginSuccess", user.getUsername());
            return "success";
        }
        else {
            message="用户名或密码错误,请重新登录!";
            return "error";
        }
    }        

}

测试结果:

第一次登录密码12,是错误的密码,因此提示用户名和密码错误,第二次密码123正确,因此进入ok.jsp页面,并显示登录后用户名为clyang,说明HttpSession类型的session成功生成,并成功用于保存用户信息。

结论:

以上三种方式都可以获取session,完成业务目标,其中ActionContext和ServletActionContext是主动获取,另外一种是被动注入。另外除了ServletActionContext获取的session是HttpSession类型,其他两种都是Map<String,Object>。

参考博文:

https://www.cnblogs.com/chong518/p/5243143.html

原文地址:https://www.cnblogs.com/youngchaolin/p/10806372.html

时间: 2024-11-05 13:27:44

SSH学习-Struts2中的session的相关文章

struts2中的session使用

1.1. 如何获取Session 1.1.1. 获取Session的方式 Struts2中获取Session的方式有3种,大家掌握其中任何一种都可以. 通过ActionContext.getContext().getSession()获得Session,注意其返回类型为 Map<String,Object>.事实上,Session对象存储数据的方式通Map一致,因此Struts2提供了Map类型的 Session,意于简化对Session的操作. 通过ServletActionContext.

Struts2中使用Session的两种方法

在Struts2里,如果需要在Action中使用到session,可以使用下面两种方式: 通过ActionContext 类中的方法getSession得到 Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到session的例子 public class SessionTestAction extends ActionSupport { public Stri

Struts2中使用Session

嗯,没错,过了这么长时间我还在做我的注册和登录. 登陆的部分自然是从数据库中查找响应的用户信息,然后把一个user放到session里, Action中代码如下: public String Login(){ User user = new User(username,password); user = userbiz.Login(user); if(user != null){ session.put("user", user); return this.SUCCESS; } ret

SSH学习-struts2的result类型

在学习struts2整合spring的过程中,以前result类型只有name属性,后面发现struts-default.xml中定义了10种result类型,在result标签中可以使用type属性来指定是哪种类型,接下来对常用的几种类型做案例进行理解. result常用类型 result类型参考struts-default.xml中对result的配置,如下所示: <result-types> <result-type name="chain" class=&qu

struts2中取得session的公共方法类

该公共方法类一般建立在com.xxx.util包下面 package com.dgh.util; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; /** * * 获得session * @author wangcunhuazi */ public class BaseAction implements SessionAware { protected Map<String,Object> ses

struts2中的session、request 、和action往页面中传值的方法

ActionContext.getContext().put("list", list); ActionContext.getContext().getValueStack().push(listName);//准备回显数据 session中放数据: ActionContext.getContext().getSession().put("user", user); /** 注销 */ public String logout() throws Exception

???Struts2框架03 session的使用、登录逻辑【session工作原理】

1 登录逻辑 1.1 获取登录数据(例如:用户民.密码) 1.2 在控制层调用业务层来验证数据信息 1.3 登录成功:保存用户信息(服务器用session.浏览器用cookie),跳转到主页满 1.4 登录失败:留在登录页面,并给出错误提示信息 2 什么是session 就是一个会话对象,有服务器创建,目的是为了共享数据(注意:每一个浏览器对应一个session对象) 3 session的工作原理 待更新... 2017年7月3日21:53:09 4 在struts2中获取session对象的方

【JAVA学习】struts2的action中使用session的方法

尊重版权:http://hi.baidu.com/dillisbest/item/0bdc35c0b477b853ad00efac 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到1.通过ActionContext class中的方法getSession得到2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到sessi

Struts学习笔记(三)struts2中获得request、response和session的三种方法

struts2中获得request.response和session的三种方法   (1)非IoC方式 方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象. ActionContext ctx = ActionContext.getContext(); ctx.put("liuwei", "andy"); //request.setAttribute("l