struts2使用拦截器完成登陆显示用户信息操作

  其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用,当然说那些使超级无敌变态并不是说他们很变态,是他们的思想太强大了。

  言归正传,这次使用的拦截器是struts2框架的核心之处,希望学习struts2框架的小伙伴重视起来哦。一起共勉。


 1:第一步依旧是导包哦,使用别人的框架,第一步,就记住导入自己使用的核心包即可。

2:配置web.xml过滤器,这些都是死东西,记住会写即可。

 1 
 2 
 3   struts2_login20170307
 4   
 5     index.html
 6     index.htm
 7     index.jsp
 8     default.html
 9     default.htm
10     default.jsp
11   
12   
13   
14   
15       
16       struts2
17       
18       class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterclass>
19   
20   
21       
22       struts2
23       
24       /*
25   
26 

3:第三步,想要登陆就必须设计号数据表,当然你首先要设计好数据库。字段如下所示:

struts2使用拦截器完成登陆显示用户信息操作_第1张图片

4:设计好数据表之后就可以创建实体类User.java,源码如下所示:

 1 package com.bie.po;
 2 
 3 import java.io.Serializable;
 4 
 5 /** 
 6 * @author BieHongLi 
 7 * @version 创建时间:2017年3月5日 上午9:40:09 
 8 * 
 9 */
10 public class User implements Serializable{
11 
12     private static final long serialVersionUID = 1L;
13     private Integer id;
14     private String name;
15     private String password;
16     private String email;
17     private String phone;
18     public Integer getId() {
19         return id;
20     }
21     public void setId(Integer id) {
22         this.id = id;
23     }
24     public String getName() {
25         return name;
26     }
27     public void setName(String name) {
28         this.name = name;
29     }
30     public String getPassword() {
31         return password;
32     }
33     public void setPassword(String password) {
34         this.password = password;
35     }
36     public String getEmail() {
37         return email;
38     }
39     public void setEmail(String email) {
40         this.email = email;
41     }
42     public String getPhone() {
43         return phone;
44     }
45     public void setPhone(String phone) {
46         this.phone = phone;
47     }
48     @Override
49     public String toString() {
50         return "User [, name=" + name + ", password=" + password + ", email=" + email + ", phone=" + phone
51                 + "]";
52     }
53     
54     
55 }

5:完成了实体类,就可以如以前学习的那样,写dao层,service层,当然servlet层被action层替换了。这里先写dao层吧,首先创建工具类BaseDao.java,源码如下所示:

package com.bie.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;


/** 
* @author BieHongLi 
* @version 创建时间:2017年3月5日 上午9:32:14 
* 数据交互层dao层
*/
public class BaseDao {

    private static String driver="com.mysql.jdbc.Driver";
    private static String url="jdbc:mysql:///test";
    private static String user="root";
    private static String password="123456";
    
    /***
     * 连接数据库的方法
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static Connection getCon() throws ClassNotFoundException, SQLException{
        Class.forName(driver);//加载数据库驱动
        System.out.println("测试加载数据库成功");
        Connection con=DriverManager.getConnection(url, user, password);
        System.out.println("测试数据库链接成功");
        return con;
    }
    
    /***
     * 关闭数据库的方法
     * @param con
     * @param ps
     * @param rs
     */
    public static void close(Connection con,PreparedStatement ps,ResultSet rs){
        if(rs!=null){//关闭资源,避免出现异常
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    /***
     * 同意增删改的方法
     * @param sql
     * @param arr
     * @return
     */
    public static boolean addUpdateDelete(String sql,Object[] arr){
        Connection con=null;
        PreparedStatement ps=null;
        try {
            con=BaseDao.getCon();//第一步 :连接数据库的操作
            ps=con.prepareStatement(sql);//第二步:预编译
            //第三步:设置值
            if(arr!=null && arr.length!=0){
                for(int i=0;i){
                    ps.setObject(i+1, arr[i]);
                }
            }
            int count=ps.executeUpdate();//第四步:执行sql语句
            if(count>0){
                return true;
            }else{
                return false;
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
    
    public static void main(String[] args) {
        try {
            BaseDao.getCon();
            System.out.println("测试数据库链接成功");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    
}

6:建议再创建一个工具类,过滤编码的UTFFilter.java

 1 package com.bie.dao;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.annotation.WebFilter;
12 import javax.servlet.http.HttpServletRequest;
13 
14 /** 
15 * @author BieHongLi 
16 * @version 创建时间:2017年2月21日 上午11:08:49 
17 * 
18 */
19 @WebFilter("/*")
20 public class UTFFilter implements Filter{
21 
22     @Override
23     public void destroy() {
24         // TODO Auto-generated method stub
25         
26     }
27 
28     @Override
29     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
30             FilterChain filterChain)throws IOException, ServletException {
31         //将servletRequest转发为HttpServletRequest
32         HttpServletRequest request=(HttpServletRequest)servletRequest;
33         request.setCharacterEncoding("utf-8");
34         filterChain.doFilter(servletRequest, servletResponse);
35     }
36 
37     @Override
38     public void init(FilterConfig arg0) throws ServletException {
39         // TODO Auto-generated method stub
40         
41     }
42     
43 
44 }

7:接着写service层的接口和实现类;

 1 package com.bie.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.po.User;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 创建时间:2017年3月5日 上午9:39:21 
10 * 
11 */
12 public interface UserDao {
13 
14     /***
15      * 登陆的方法
16      * @param user
17      * @return
18      */
19     public User selectLogin(User user);
20     
21     /***
22      * 用户查询的方法
23      * @param sql
24      * @param arr
25      * @return
26      */
27     public List selectUser(String sql,Object[] arr);
28 }
  1 package com.bie.dao.impl;
  2 
  3 import java.sql.Connection;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import com.bie.dao.BaseDao;
 11 import com.bie.dao.UserDao;
 12 import com.bie.po.User;
 13 
 14 /** 
 15 * @author BieHongLi 
 16 * @version 创建时间:2017年3月5日 上午9:39:35 
 17 * 
 18 */
 19 public class UserDaoImpl implements UserDao{
 20 
 21     @Override
 22     public User selectLogin(User user) {
 23         Connection con=null;
 24         PreparedStatement ps=null;
 25         ResultSet rs=null;
 26         try {
 27             con=BaseDao.getCon();//1:获取数据库的连接
 28             //2:书写sql语句
 29             String sql="select * from user where name=? and password=? ";
 30             ps=con.prepareStatement(sql);//3:预编译
 31             //4:设置值
 32             ps.setString(1, user.getName());
 33             ps.setString(2, user.getPassword());
 34             rs=ps.executeQuery();//5:执行sql语句
 35             User users;
 36             if(rs.next()){
 37                 users=new User();
 38                 //从数据库中获取值设置到实体类的setter方法中
 39                 users.setId(rs.getInt("id"));
 40                 users.setName(rs.getString("name"));
 41                 users.setPassword(rs.getString("password"));
 42                 users.setEmail(rs.getString("email"));
 43                 users.setPhone(rs.getString("phone"));
 44                 //user.setIsAdmin(rs.getString("isAdmin"));
 45                 
 46                 //return user;
 47             }
 48         } catch (ClassNotFoundException e) {
 49             e.printStackTrace();
 50         } catch (SQLException e) {
 51             e.printStackTrace();
 52         }finally{
 53             //关闭资源,避免出现异常
 54             BaseDao.close(con, ps, rs);
 55         }
 56         return user;
 57     }
 58 
 59     @Override
 60     public List selectUser(String sql, Object[] arr) {
 61         Connection con=null;
 62         PreparedStatement ps=null;
 63         ResultSet rs=null;
 64         try {
 65             con=BaseDao.getCon();//第一步连接数据库
 66             ps=con.prepareStatement(sql);//第二步:预编译
 67             if(arr!=null){
 68                 for(int i=0;i){
 69                     ps.setObject(i+1, arr[i]);
 70                 }
 71             }
 72             //第四步执行sql
 73             rs=ps.executeQuery();
 74             List list=new ArrayList();
 75             while(rs.next()){
 76                 User user=new User();
 77                 user.setId(rs.getInt("id"));
 78                 user.setName(rs.getString("name"));
 79                 user.setPassword(rs.getString("password"));
 80                 user.setEmail(rs.getString("email"));
 81                 user.setPhone(rs.getString("phone"));
 82                 
 83                 //System.out.println(user);//测试数据
 84                 list.add(user);
 85             }
 86             return list;
 87         } catch (ClassNotFoundException e) {
 88             e.printStackTrace();
 89         } catch (SQLException e) {
 90             e.printStackTrace();
 91         }finally{
 92             //关闭资源,避免出现异常
 93             BaseDao.close(con, ps, rs);
 94         }
 95         
 96         return null;
 97     }
 98 
 99     
100 }

8:接着写service层的接口和实现类,接口UserService.java和实现类UserServiceImpl.java;

 1 package com.bie.service;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.po.User;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 创建时间:2017年2月23日 下午1:58:59 
10 * 
11 */
12 public interface UserService {
13 
14     /***
15      * 用户查询的信息
16      * @param user
17      * @return
18      */
19     public List selectUser(User user);
20     
21     /***
22      * 用户登陆的功能
23      * @param user
24      * @return
25      */
26     public User login(User user);
27 }
 1 package com.bie.service.impl;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.bie.dao.UserDao;
 7 import com.bie.dao.impl.UserDaoImpl;
 8 import com.bie.po.User;
 9 import com.bie.service.UserService;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年2月23日 下午1:59:36 
14 * 
15 */
16 public class UserServiceImpl implements UserService{
17 
18     private UserDao dao=new UserDaoImpl();
19     
20     @Override
21     public List selectUser(User user) {
22         //sql语句
23         //String sql="select * from user ";
24         StringBuilder sql=new StringBuilder("select * from user where 1=1 ");
25         List list=new ArrayList();
26         if(user!=null){
27             //按照姓名查询
28             if(user.getName()!=null && !user.getName().equals("")){
29                 sql.append(" and name = ? ");
30                 list.add(user.getName());
31             }
32             //按照email查询
33             if(user.getEmail()!=null && !user.getEmail().equals("")){
34                 sql.append(" and email = ? ");
35                 list.add(user.getEmail());
36             }
37             
38         }
39         return dao.selectUser(sql.toString(), list.toArray());
40     }
41 
42 
43     @Override
44     public User login(User user) {
45         if(user!=null && user.getName()!=null && user.getPassword()!=null){
46             return dao.selectLogin(user);
47         }
48         return null;
49     }
50 
51     
52 } 
   
  

9:开始写登陆页面login.jsp页面和用户信息显示list.jsp页面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 
 4 
 5 
 6 
 7 登陆的页面
 8 
 9 
10 
11 
12 账号:
13 密码:
14 15 16
17 18
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib prefix="s" uri="/struts-tags"%>
 4 
 5 
 6 
 7 
 8 信息列表展示的页面
 9 
10 
11 
12 131415161718192021
22         23262932353839404142
编号 姓名 密码 邮件 电话
24 25 27 28 30 31 33 34 36 37
43 44 45

10:登陆页面点击登陆就到了struts.xml页面,struts.xml页面会到action页面,所以现在写struts.xml页面的源码;

 1 
 2 DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5  
 6 
 7     
 8     <package name="user" extends="struts-default"> 
 9         
10         
11             class="com.bie.interceptor.UserCheckInterceptor">
12             
13                 
14                 
15                 
16             
17         
18         
19         <default-interceptor-ref name="myStack">default-interceptor-ref>
20         
21         
22         
23             error.jsp
24         
25     
26         class="com.bie.action.UserAction" method="{1}">
27             
31              
35               
36               
37             
38             login.jsp
39             
40             
41             user_list
42             
43             
44             list.jsp
45         
46     package>
47 

11:struts.xml页面的action会和UserAction.java的方法进行匹配,所以现在写UserAction.java,然后就可以完成登陆功能;

 1 package com.bie.action;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.po.User;
 6 import com.bie.service.UserService;
 7 import com.bie.service.impl.UserServiceImpl;
 8 import com.opensymphony.xwork2.ActionContext;
 9 import com.opensymphony.xwork2.ActionSupport;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年3月7日 上午10:31:34 
14 * 
15 */
16 public class UserAction extends ActionSupport{
17 
18     private static final long serialVersionUID = 1L;
19     //----------1:封装请求数据------------
20     private User user;
21     public User getUser() {
22         return user;
23     }
24     public void setUser(User user) {
25         this.user = user;
26     }
27     //-----------2:调用service方法------------
28     private UserService service=new UserServiceImpl();
29     
30     //-----------3:登陆的action方法----------------------
31     public String login() throws Exception {
32         try {
33             User userInfo=service.login(user);
34             //判断,如果为空,返回失败input
35             if(userInfo==null){
36                 //登录失败
37                 return "input";
38             }
39             //如果登陆成功,数据保存到session中
40             ActionContext.getContext().getSession().put("userInfo", "userInfo");
41             
42             return "loginSuccess";
43         } catch (Exception e) {
44             return "ERROR";
45         }
46     }
47     
48     //-----------4:列表,处理显示数据的方法-------------
49     public String list(){
50         try {
51             //查询全部
52             List list=service.selectUser(user);
53             //保存到request中
54             ActionContext.getContext().getContextMap().put("listUser", list);
55             
56             return "list";
57         } catch (Exception e) {
58             return "ERROR";
59         }
60     }
61     
62 }

12:最后就再创建一个包interceptor包,这里面写过滤器,这是过滤器的核心,也是struts2的核心技术,所以需要重点掌握哦;源码如下所示:(注意:UserCheckInterceptor会和struts.xml的过滤器配置进行交互,最后完成拦截器的功能)

 1 package com.bie.interceptor;
 2 
 3 import com.opensymphony.xwork2.ActionContext;
 4 import com.opensymphony.xwork2.ActionInvocation;
 5 import com.opensymphony.xwork2.ActionProxy;
 6 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 7 
 8 /** 
 9 * @author BieHongLi 
10 * @version 创建时间:2017年3月7日 下午1:28:00 
11 * 拦截业务处理方法
12 */
13 public class UserCheckInterceptor extends AbstractInterceptor{
14 
15     
16     private static final long serialVersionUID = 1L;
17     
18     //步骤:1:首先拿到当前执行的方法名,2:然后进行判断 ,只要当前方法名不是login,就需要进行验证
19     @Override
20     public String intercept(ActionInvocation invocation) throws Exception {
21         //获取ActionContext对象
22         ActionContext ac=invocation.getInvocationContext();
23         //获取action对象的代理对象
24         ActionProxy proxy=invocation.getProxy();
25         //获取当前执行的方法名
26         String methodName=proxy.getMethod();
27         //判断是否登陆
28         if(!"login".equals(methodName)){
29             //先获取当前登陆的用户
30             Object obj=ac.getSession().get("userInfo");
31             if(obj == null){
32                 //当前用户没有登陆
33                 return "input";
34             }else{
35                 //当前用户有登陆
36                 return invocation.invoke();
37             }
38         }else{
39             //当前用户正在登陆
40             return invocation.invoke();
41         }
42     }
43 
44     
45 }

演示效果如下所示:

革命尚未成功,拦截器我都学会了,努力!!!

你可能感兴趣的:(struts2使用拦截器完成登陆显示用户信息操作)