步骤:
1.编写实体类
public class User { private String username; private String password; public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } }
2.编写数据库的配置文件 db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mvctest?useSSL=true&useUnicode=true&characterEncoding=utf-8 username=root password=root
3.编写公共类
-
BaseDao
public class BaseDao { private static String driver; private static String url; private static String username; private static String password; //静态代码块 static { try { Properties properties = new Properties(); InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); properties.load(is); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); } catch (IOException e) { e.printStackTrace(); } } //连接数据库的方法 public static Connection getConnection() { Connection connection = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); } return connection; } //查询数据库的方法 public static ResultSet execute(Connection connection, PreparedStatement pstt,ResultSet rs,String sql,Object[] params) throws SQLException { pstt = connection.prepareStatement(sql); for ( int i = 0; i < params.length; i++ ) { pstt.setObject(i+1,params[i]); } rs = pstt.executeQuery(); return rs; } //关闭数据源 public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) { boolean flag = true; if ( resultSet != null ) { try { resultSet.close(); resultSet = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if ( preparedStatement != null ) { try { preparedStatement.close(); preparedStatement = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } if ( connection != null ) { try { connection.close(); connection = null; } catch (SQLException e) { e.printStackTrace(); flag = false; } } return flag; } }
-
Constant
public class Constant { public static final String USER_SESSION = "userSession"; }
4.编写过滤器(用来设置字符编码格式)
public class ChrasetEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); filterChain.doFilter(request,response); } public void destroy() { } }
**配置过滤器的xml **
<filter> <filter-name>ChrasetEncodingFilter</filter-name> <filter-class>com.cc.filter.ChrasetEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>ChrasetEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5.编写dao层
public interface UserDao { public User loginUser(Connection connection,String username,String password) throws SQLException; }
实现类
public class UserDaoImpl implements UserDao{ public User loginUser(Connection connection, String username, String password) throws SQLException { PreparedStatement pstt = null; ResultSet rs = null; User user = null; if ( connection != null ) { String sql = " select * from people where username = ? and password = ?"; Object[] params = {username,password}; rs = BaseDao.execute(connection, pstt, rs, sql, params); if ( rs.next() ) { user = new User(); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); } BaseDao.closeResource(null,pstt,rs); } return user; } }
6.编写业务层service
public interface UserService { public User findUserNameandPassword(String username,String password); }
实现类
public class UserServiceImpl implements UserService{ //调用dao层 private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImpl(); } public User findUserNameandPassword(String username, String password) { Connection connection = null; User user = null; try { connection = BaseDao.getConnection(); user = userDao.loginUser(connection, username, password); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(connection,null,null); } return user; } }
7.编写Loginservlet
public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); req.setAttribute("name", username); UserService userService = new UserServiceImpl(); User user = userService.findUserNameandPassword(username, password); if (user != null) { req.getSession().setAttribute(Constant.USER_SESSION, user); resp.sendRedirect("/sys/success.jsp"); } else { req.getRequestDispatcher("/error.jsp").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
配置xml
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.cc.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
8.编写前端登录页面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录界面</title> </head> <body> <div style="text-align: center"> <h1>个人信息登录</h1> <form action="${pageContext.request.contextPath}/login" method="post"> <div> <label>用户名:</label> <input type="text" name="username" placeholder="请输入用户名"> </div> <div> <label>密码:</label> <input type="password" name="password" placeholder="请输入密码"> </div> <div> <input type="submit" value="登录"> </div> </form> </div> </body> </html>
9.当输入的用户名和密码和数据库一样时,则跳转到/sys/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1>${sessionScope.userSession.username},欢迎您</h1> <p><a href="/logout">注销</a> </p> </body> </html>
10.注销后则不能访问 /sys/success.jsp (设置过滤器)
public class SysFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; Object session = request.getSession().getAttribute(Constant.USER_SESSION); if ( session == null ) { response.sendRedirect("/login.jsp"); } filterChain.doFilter(request,response); } @Override public void destroy() { } }
配置xml
<filter> <filter-name>SysFilter</filter-name> <filter-class>com.cc.filter.SysFilter</filter-class> </filter> <filter-mapping> <filter-name>SysFilter</filter-name> <url-pattern>/sys/*</url-pattern> </filter-mapping>
11.注销后跳转到logout中(LogoutServlet)
public class LogoutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object session = req.getSession().getAttribute(Constant.USER_SESSION); if ( session != null ) { req.getSession().removeAttribute(Constant.USER_SESSION); resp.sendRedirect("/login.jsp"); } else { resp.sendRedirect("/login.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
配置xml
<servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.cc.servlet.LogoutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/logout</url-pattern> </servlet-mapping>
12.当输入的用户名和密码和数据库不一样时,则跳转到error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>失败界面</title> </head> <body> <h1>抱歉,${requestScope.name}没有权限访问</h1> <p><a href="login.jsp">返回首页</a></p> </body> </html>
13.设置首页
<welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
数据库数据如下:
效果如下:
首页
输入正确的用户名和密码时:
注销后再访问 sys/success.jsp 访问失败
输入正确的用户名和错误的密码时:
输入错误的用户名和密码时: