本特利的学习笔记
实现用户登录
1.要求
用Spring框架创建一个基于MVC模式的Web应用实现用户登录验证。
具体要求:
- 用Spring JDBC实现和数据库的访问;
- 用Spring MVC实现控制器,接收用户在页面输入的用户名和密码;
- 用Spring的IoC和AOP实现权限检查和日志记录;
2.分析
实现上述任务会涉及到的页面、接口和类如下:
login.jsp: 提供输入用户名和密码的界面
UserController.java:接收用户的请求(用户名、密码),根据用户请求调用UserService中的方法;
UserService接口和UserServiceImpl类;
UserDAO接口和UserDAOImpl类:利用Spring JDBC实现用户登录验证
3.知识点
1.Spring MVC前端控制器
SpringMVC是Spring框架的一部分,采用MVC设计模式的一个轻量级Web框架,优点比较多,控制器不用继承任何父类或者实现任何接口,提供了一个前端控制器DispatcherServlet,由HttpServlet派生的来。和其他Servlet一样,需要在web.xml中配置。
具体配置代码如下:
- ContextLoaderListener
ContextLoaderListener的作用:启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。3.视图解析器
Spring MVC中的视图解析器负责解析视图,配置视图解析器时,可以指定前缀和后缀。如下图所示:
4.控制器类
控制器主要完成:
- 用于接收用户的请求;
- 根据用户请求调用Model层的方法;
- 根据方法的返回值,跳转页面;
4.实操
第一步:新建一个Java Web项目,导入以下Jar包:
第二步:在web.xml中配置:
1.配置加载的Spring配置文件的路径和文件
2.配置ContextLoaderListener
<!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
3.配置前端控制器
4.配置字符编码过滤器
第三步:编写DAO层接口和类
1.编写UserDao接口
/** * * @author Administrator * */ public interface UserDao { /** * 用户登录方法 * @param name 用户名 * @param pwd 密码 * @return true 代表登录成功 false代表登录失败 */ public boolean doLogin(final String name,final String pwd); }
2.实现类UserDaoImpl
/** * UserDaoImpl实现UserDao接口, 通过JdbcTemplate实现对用户修改密码 * * @author Administrator * */ @Repository("userDao") public class UserDaoImpl implements UserDao { @Autowired JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public boolean doLogin(final String name,final String pwd) { String sql="select * from users where loginId=? and loginPwd=?"; RowMapper<Users> rowMapper=new BeanPropertyRowMapper<Users>(Users.class); Object []args=new Object[]{name,pwd}; try { jdbcTemplate.queryForObject(sql, args, rowMapper); } catch (DataAccessException e) { System.out.println("用户名或者密码不正确"); return false; } return true; } } }
第四步:编写Service接口和类
1.编写UserService接口
public interface UserService { /** * 用户登录方法 * @param name 用户名 * @param pwd 密码 * @return true 代表登录成功 false代表登录失败 */ public boolean doLogin(String name,String pwd); }
2.实现类UserServiceImpl
@Service("userService") public class UserServiceImpl implements UserService { @Autowired @Qualifier("userDao") UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public boolean doLogin(String name, String pwd) { // TODO Auto-generated method stub return userDao.doLogin(name, pwd); } }
3.编写切面类
/** * 切面类,实现用户权限检查和日志记录 * @author Administrator * */ @Aspect @Component public class MyAspect { @Pointcut("execution(* com.chap52.service.impl.*.*(..))") private void myPointCut(){} /** * 用户权限检查 */ @Before("myPointCut()") public void checkPermission(){ System.out.println("模拟用户权限检查"); } /** * 模拟日志记录 */ @AfterReturning("myPointCut()") public void log(){ System.out.println("模拟日志记录"); } }
第五步:编写Controller
1.编写控制器类,不用继承任何类或者实现任何接口。
@Controller public class UserController { @Autowired UserService userService; @RequestMapping("login") public String doLogin(Users user) { if(userService.doLogin(user.getLoginId(), user.getLoginPwd())){ return "index"; } else{ return "login"; } } }
2.编写Users类,属性和数据库中字段类型和字段名一致,首字母小写,采用驼峰命名规则。
/** * POJO类,和数据库中的users表一致 * @author Administrator * */ public class Users { private int id; private String loginId; private String loginPwd; private String name; private String address; private String phone; private String mail; private int userRoleId; private int userStateId; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLoginId() { return loginId; } public void setLoginId(String loginId) { this.loginId = loginId; } public String getLoginPwd() { return loginPwd; } public void setLoginPwd(String loginPwd) { this.loginPwd = loginPwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public int getUserRoleId() { return userRoleId; } public void setUserRoleId(int userRoleId) { this.userRoleId = userRoleId; } public int getUserStateId() { return userStateId; } public void setUserStateId(int userStateId) { this.userStateId = userStateId; } @Override public String toString() { return "Users [id=" + id + ", loginId=" + loginId + ", loginPwd=" + loginPwd + ", name=" + name + ", address=" + address + ", phone=" + phone + ", mail=" + mail + ", userRoleId=" + userRoleId + ", userStateId=" + userStateId + "]"; } }
第六步:编写JSP页面
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="login" method="post"> 用户名:<input type="text" name="loginId"/><br> 密码:<input type="password" name="loginPwd"/><br> <input type="submit" value="登录"/> </form> </body> </html> index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 你好,登录成功! </body> </html>
第七步:编写SpringJDBC配置文件、Spring配置文件和SpringMVC配置文件
1.SpringJDBC配置文件
在src文件夹下,新建database.xml,配置数据源和jdbcTemplate,代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <!-- 配置数据源 --> <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybookshop" /> <property name="username" value="ruanjian18" /> <property name="password" value="123456" /> </bean> <!-- 配置JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="datasource" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="datasource" /> </bean> <!-- 启用事务管理注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 配置事务增强 --> <tx:advice id="txAdvie" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/> </tx:attributes> </tx:advice> <!-- 用声明式AspectJ--> <aop:config> <aop:pointcut expression="execution(* com.chap501.dao.impl.*.*(..))" id="txPointCut"/> <aop:advisor advice-ref="txAdvie" pointcut-ref="txPointCut"/> </aop:config> </beans>
2.Spring配置文件
在src文件夹下,新建applicationContext.xml配置文件,启动注解方式加载Bean,启用注解的声明式Aspect J和导入SpringJDBC的配置文件database.xml。代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 导入一个配置文件 --> <import resource="classpath*:/database.xml"/> <!-- 启动注解 --> <context:component-scan base-package="com.chap52.**" /> <!-- 启动AOP注解 --> <aop:aspectj-autoproxy /> </beans>
3.SpringMVC配置文件
在src文件夹下,新建springmvc-config.xml配置文件,配置用注解的方式扫描Controller和配置视图解析器,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- 配置用户定义的Controller的实例 --> <context:component-scan base-package="com.chap52.controller" /> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 指定前缀 --> <property name="prefix" value="/" /> <!-- 指定后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans>
第八步:运行,查看结果
选中login.jsp,右键“Run as”->"Run on Server"查看运行结果。