其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用,当然说那些使超级无敌变态并不是说他们很变态,是他们的思想太强大了。
言归正传,这次使用的拦截器是struts2框架的核心之处,希望学习struts2框架的小伙伴重视起来哦。一起共勉。
1:第一步依旧是导包哦,使用别人的框架,第一步,就记住导入自己使用的核心包即可。
2:配置web.xml过滤器,这些都是死东西,记住会写即可。
1 23 struts2_login20170307 45 12 13 14index.html 6index.htm 7index.jsp 8default.html 9default.htm 10default.jsp 1115 16 20struts2 17 18class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter class> 1921 22 26struts2 23 24/* 25
3:第三步,想要登陆就必须设计号数据表,当然你首先要设计好数据库。字段如下所示:
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 ListselectUser(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 ListselectUser(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 ListselectUser(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 ListselectUser(User user) { 22 //sql语句 23 //String sql="select * from user "; 24 StringBuilder sql=new StringBuilder("select * from user where 1=1 "); 25 List
9:开始写登陆页面login.jsp页面和用户信息显示list.jsp页面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 5 6 717 18登陆的页面 8 9 10 11
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
编号 | 15姓名 | 16密码 | 17邮件 | 18电话 | 19
---|---|---|---|---|
24 |
26
27 |
29
30 |
32
33 |
35
36 |
38
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 67 8 <package name="user" extends="struts-default"> 9 10 11 18 19 <default-interceptor-ref name="myStack">default-interceptor-ref> 20 21 22class="com.bie.interceptor.UserCheckInterceptor"> 1213 14 1715 16 23 25 26error.jsp 24class="com.bie.action.UserAction" method="{1}"> 27 31 35 36 37 38 46 package> 47login.jsp 39 40 41user_list 42 43 44list.jsp 45
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 Listlist=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 }
演示效果如下所示:
革命尚未成功,拦截器我都学会了,努力!!!