一、项目搭建
1、初始化pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>smbms</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> </project>
2、初始化web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> </web-app >
3、测试
4、导入依赖
<dependencies> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!-- Servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSP依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> </dependency> <!-- mysql8 驱动,与本地mysql版本需要一致 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> </dependencies>
5、编写实体类
JavaBean:编写getter和setter方法、重写toString方法、无参构造方法。
6、初始化配置文件
db.properties
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/smbms?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username=root password=xxxxxx
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//OTD Config 3.0//EN" "http://mybatis.org/schema/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> </configuration>
7、Mybatis工具类
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //1.获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //通过工厂创建SqlSession对象 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
8、配置编码过滤器
import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //防止乱码 servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); filterChain.doFilter(servletRequest,servletResponse); } }
注册
<!-- 字符编码过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.lyh.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--过滤所有请求和响应--> <url-pattern>/*</url-pattern> </filter-mapping>
9、静态资源
10、登录实现
1、设置欢迎页面
在web,xml中设置欢迎页面
<!--设置欢迎页面--> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list>
2、查询用户权限
在 mybatis-config,xml 中配置别名和接口映射。
<typeAliases> <typeAlias type="com.lyh.pojo.User" alias="User"/> </typeAliases> <mappers> <mapper class="com.lyh.dao.UserMapper"/> </mappers>
4、编写逻辑层
在UserDao中实现UserMapper.xml接口中的方法。
import com.lyh.pojo.User; import com.lyh.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; public class UserDao { public User login(User user) { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User loginUser = mapper.getLoginUser(user.getUserCode()); sqlSession.close(); if (loginUser == null) { System.out.println("========= 用户不存在 ========="); return null; } else if (loginUser.getUserPassword().equals(user.getUserPassword())) { System.out.println("======== 密码正确 ========="); return loginUser; } else { System.out.println("========== 密码错误 ========="); return null; } } }
5、编写Servlet
注意:重定向时地址栏会从 https:localhost//开始 可能会导致没有 工程名 而产生404错误 所以我们在重定向的时候需要带上工程名。
import com.lyh.dao.UserDao; import com.lyh.pojo.User; import com.lyh.utils.Constant; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet extends HttpServlet { //Servlet:控制层调用业务层代码 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("============ loginServlet start ============="); String userCode = req.getParameter("userCode"); String userPassword = req.getParameter("userPassword"); User user = new User(); user.setUserCode(userCode); user.setUserPassword(userPassword); //和数据库中的密码进行对比 UserDao dao = new UserDao(); User loginUser = dao.login(user); if (loginUser != null){ //将用户信息保存到Session中 req.getSession().setAttribute(Constant.USER_SESSION,loginUser); //重定向到主页 resp.sendRedirect("/smbms_war/jsp/frame.jsp"); }else { //转发回登录页面 并提示用户名或者密码错误 req.setAttribute("error","用户名或者密码错误"); //对应login.jsp中的<div class="info">${error }</div> req.getRequestDispatcher("/login.jsp").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
记得注册到web.
xml
11、实现注销功能
思路:移除session,返回首页
1、创建注销Servlet
import com.lyh.utils.Constant; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginOutServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //清除Session 实现注销 req.getSession().removeAttribute(Constant.USER_SESSION); //通过请求获取当前的项目路径 确保重定向时省去父目录的问题 resp.sendRedirect(req.getContextPath()+"/login.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
2、注册到web.xml
<servlet> <servlet-name>LoginOutServlet</servlet-name> <servlet-class>com.lyh.servlet.user.LoginOutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginOutServlet</servlet-name> <url-pattern>/jsp/logout.do</url-pattern> </servlet-mapping>
3、登录拦截优化
1、编写Servlet
import com.lyh.pojo.User; import com.lyh.utils.Constant; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class SysFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //ServletRequest和ServletResponse都是抽象类 功能不完善 我们需要用它们的子类的一些功能 //为了获取Session HttpServletRequest req = (HttpServletRequest) servletRequest; //为了重定向 HttpServletResponse resp = (HttpServletResponse) servletResponse; //过滤器 从Session中获取过滤器 User user = (User) req.getSession().getAttribute(Constant.USER_SESSION); if (user == null){//如果用户已经注销 就需要拦截 resp.sendRedirect("/smbms_war/error.jsp");//重定向的路径需要带 项目名称 }else { filterChain.doFilter(servletRequest,servletResponse); } } public void destroy() { } }
2、注册到web.xml
<!-- 用户登陆过滤器 --> <filter> <filter-name>SysFilter</filter-name> <filter-class>com.lyh.filter.SysFilter</filter-class> </filter> <filter-mapping> <filter-name>SysFilter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>