Spring MVC(二)--Spring MVC登陆实例

本文通过一个简单的登陆实例实现Spring MVC的流程,同时整合 MyBatis使用,流程是这样的:

1、访问一个URL进入登陆界面

2、输入正确的用户名和密码,成功则进入index页面,否则留在登陆页

一、配置web.xml

创建好WEB项目之后的第一步就是配置web.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 5 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 6     <display-name>Archetype Created Web Application</display-name>
 7     <!-- Spring MVC配置 -->
 8     <!-- 配置spring IoC配置文件路径 -->
 9     <context-param>
10         <param-name>contextConfigLocation</param-name>
11         <param-value>/WEB-INF/applicationContext.xml</param-value>
12     </context-param>
13 
14     <!--配置ContextLoaderListener 用以初始化Spring IoC容器 ⚠️如果不在此处注册,则在DispatcherServlet初始化的时候会对它进行初始化,建议ioc先于DispatcherServlet进行初始化 -->
15     <listener>
16         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
17     </listener>
18 
19     <!-- 配置DispatcherServlet :spring mvc会根据servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作为配置文件载入web工程中 -->
20     <servlet>
21         <servlet-name>dispatcher</servlet-name>
22         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
23         <!--这个配置项用来控制这个servlet的加载时间:当值>=0时,表示容器启动时就加载,值越小优先级越高;当<0时,表示当该servlet被请求时才会加载;⚠️值为整数  -->
24         <!--使dispatcher在服务启动的时候就进行初始化 -->
25         <load-on-startup>2</load-on-startup>
26     </servlet>
27 
28     <!--servlet拦截配置 -->
29     <servlet-mapping>
30         <servlet-name>dispatcher</servlet-name>
31         <url-pattern>/</url-pattern>
32     </servlet-mapping>
33 
34     <!-- 解决中文乱码 -->
35     <filter>
36         <filter-name>encodingFilter</filter-name>
37         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
38         <init-param>
39             <param-name>encoding</param-name>
40             <param-value>UTF-8</param-value>
41         </init-param>
42     </filter>
43     <filter-mapping>
44         <filter-name>encodingFilter</filter-name>
45         <url-pattern>/*</url-pattern>
46     </filter-mapping>
47 </web-app>

 具体配置的内容已经在注释中说明。

二、配置Spring IoC

按照配置在/WEB-INF/目录下创建文件applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 9     <!-- 使用注解驱动 -->
10     <context:annotation-config />
11 
12     <!-- 配置数据源--使用数据库连接池 -->
13     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
14         <property name="driverClassName" value="org.postgresql.Driver" />
15         <property name="url" value="jdbc:postgresql://localhost:5433/postgres" />
16         <property name="username" value="postgres" />
17         <property name="password" value="hyc123" />
18         <!-- 最大数据库连接数 -->
19         <property name="maxActive" value="100" />
20         <!-- 最大空闲数,即等待连接数 -->
21         <property name="maxIdle" value="5" />
22         <!-- 最大等待连接时间 -->
23         <property name="maxWait" value="10000" />
24     </bean>
25 
26     <!-- 集成mybatis -->
27     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
28         <property name="dataSource" ref="dataSource" />
29         <!--注意⚠️:classpath后面没有*号  -->
30         <property name="configLocation" value="classpath:mybatis-config.xml" />
31     </bean>
32 
33     <!-- 配置数据源事务管理器 -->
34     <bean id="transactionManager"
35         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
36         <property name="dataSource" ref="dataSource"></property>
37     </bean>
38 
39     <!-- 采用自动扫描方式创建mapper bean  注意⚠️:第二个属性名为sqlSessionFactory,如果是sqlSessionFactoryBeanName启动时会报错 -->
40     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
41         <property name="basePackage" value="com.mvc.dao" />
42         <property name="sqlSessionFactory" ref="sqlSessionFactory" />
43         <property name="annotationClass" value="org.springframework.stereotype.Repository" />
44     </bean>
45 </beans>

在上述的配置中集成了MyBatis,所以还要创建一个MyBatis的配置文件mybatis-config.xml

三、创建MyBatis配置文件mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!-- mybatis的基本配置文件:主要配置基本的上下文参数和运行环境 -->
 6 <configuration>
 7     <!--设置 -->
 8     <settings>
 9         <!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 -->
10         <setting name="cacheEnabled" value="true" />
11         <!--延时加载的全局开关 -->
12         <setting name="lazyLoadingEnabled" value="false" />
13         <!-- 是否允许单一语句返回多结果集 -->
14         <setting name="multipleResultSetsEnabled" value="false" />
15         <!-- 使用列标签代替列名,需要兼容驱动 -->
16         <setting name="useColumnLabel" value="true" />
17         <!-- 允许JDBC自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍能正常工作 -->
18         <setting name="useGeneratedKeys" value="false" />
19         <!-- 指定MyBatis该如何自动映射列到字段或属性:NONE表示取消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集;FULL会自动映射任意复杂的结果集,无论是否嵌套 -->
20         <setting name="autoMappingBehavior" value="PARTIAL" />
21         <!-- 配置默认的执行器:SIMPLE是普通的执行器;REUSE会重用预处理语句;BATCH会重用语句并执行批量更新 -->
22         <setting name="defaultExecutorType" value="SIMPLE" />
23         <!--设置超时时间:它决定驱动等待数据库响应的秒数,任何正整数 -->
24         <!-- <setting name="defaultStatementTimeout" value="25"/> -->
25         <!--设置数据库驱动程序默认返回的条数限制,此参数可以重新设置,任何正整数 -->
26         <!-- <setting name="defaultFetchSize" value="100" /> -->
27         <!-- 允许在嵌套语句中使用分页(RowBounds) -->
28         <setting name="safeRowBoundsEnabled" value="false" />
29         <!-- 是否开启自动驼峰命名规则,即从a_example到aExample的映射 -->
30         <setting name="mapUnderscoreToCamelCase" value="true" />
31         <!-- 本地缓存机制,防止循环引用和加速重复嵌套循环 -->
32         <setting name="localCacheScope" value="SESSION" />
33         <!-- 当没有为参数提供特定JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,如NULL/VARCHAR/OTHER -->
34         <setting name="jdbcTypeForNull" value="OTHER" />
35         <!-- 指定触发延迟加载的方法,如equals/clone/hashCode/toString -->
36         <setting name="lazyLoadTriggerMethods" value="equals" />
37     </settings>
38     <!--类型命名 -->
39     <!--别名:pojo对象的别名 -->
40     <typeAliases>
41         <!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 -->
42         <package name="com.mvc.pojo" />
43         <package name="com.mvc.objectfactory" />
44         <package name="com.mvc.bean" />
45         <package name="com.mvc.dao" />
46     </typeAliases>
47     <!--插件 -->
48     <!-- <plugins /> -->
49     <!-- 映射器 -->
50     <mappers>
51         <mapper resource="com/mvc/mapper/EmployeeMapper.xml" />
52     </mappers>
53 
54 </configuration>

四、创建页面

在webapp下新建一个名为jsp的文件夹,在该文件下创建一个登陆页login.jsp和欢迎页index.jsp

1⃣️login.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <div style="marging-left: 20px; margin-top: 30px;">
11         <form action="index" method="post">
12             <label>用户名:</label><input type="text" name="username" value="">
13             <label>密码:</label><input type="password" name="pwd" value="">
14             <input type="submit" value="登陆">
15         </form>
16     </div>
17 </body>
18 </html>

2⃣️index.jsp

使用jstl标签库显示用户名

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 
12     <div
13         style="position: absolute; top: 100px; left: 100px; color: red; font-size: x-large; float: left;">Hello <c:out value="${username}"></c:out></div>
14 
15 </body>
16 </html>

上面的文件中红色加粗的部分是jstl标签库的导入和使用,在使用之前要将对应的jar包加到lib中。

五、创建控制器Controller

 1 @Controller
 2 @RequestMapping("/login")
 3 public class LoginController {
 4 
 5     @Autowired
 6     @Qualifier("userService")
 7     UserServiceImpl userService = null;
 8 
 9     @RequestMapping(value = "/login", method = RequestMethod.GET)
10     public ModelAndView login() {
11         ModelAndView mv = new ModelAndView();
12         mv.setViewName("login");
13         return mv;
14     }
15 
16     @RequestMapping(value = "/index", method = RequestMethod.POST)
17     public ModelAndView index(@RequestParam("username") String username, @RequestParam("pwd") String pwd) {
18         ModelAndView mv = new ModelAndView();
19         String viewName = "login";
20         if (null != username && null != pwd) {
21             boolean res = userService.checkUserInfo(username, pwd);
22             viewName = res ? "index" : "login";
23         }
24         mv.setViewName(viewName);
25         mv.addObject("username",username);
26         return mv;
27 
28     }
29 }

上面加粗的红色代码依次表示:

1、注解@Controller :告诉Spring MVC这是一个控制器,这样它就会接受请求并进行处理;

2、注解@RequestMapping("/login"):这个controller的方法URL,它从URL中的项目名后面开始;

3、注解@Autowired和注解@Qualifier是spring中的自动装配;

4、用在两个方法上的注解@RequestMapping用来定义这个方法的请求路径,它们和controller一起组成前端的访问URI,它还可以定义请求的方法类型,如果不定义value,则默认用方法名;

5、index方法中的注解@RequestParam用来获取前端传过来的参数;

上面的index方法中,会调用业务逻辑层,判断用户名和密码是否正确,根据结果来判断返回哪个视图,所以下一步是创建业务逻辑处理类。

六、处理业务逻辑

业务逻辑写在Service层,采用面向接口编程的方式,在service中还要调用数据库访问层mapper,所以接下来需要创建以下文件:

1⃣️创建映射器接口

1 @Repository
2 public interface EmployeeMapper {
3 
4     Employee getEmployByName(@Param("username") String username, @Param("pwd") String pwd);
5 }

因为使用的是MapperScannerConfigurer自动扫描mapper,所以需要加上注解@Repository

2⃣️创建映射器文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.mvc.dao.EmployeeMapper">
 4     <resultMap id="BaseResultMap" type="com.mvc.pojo.Employee">
 5         <id column="id" jdbcType="INTEGER" property="id" />
 6         <result column="username" jdbcType="VARCHAR" property="username" />
 7         <result column="pwd" jdbcType="VARCHAR" property="pwd" />
 8         <result column="sex" jdbcType="VARCHAR" property="sex" />
 9         <result column="random" jdbcType="VARCHAR" property="random" />
10     </resultMap>
11     <sql id="Base_Column_List">
12         id, username, pwd, sex, random
13     </sql>
14     <select id="getEmployByName" resultMap="BaseResultMap">
15         SELECT * FROM employee e WHERE e.username =    #{username,jdbcType=VARCHAR} AND e.pwd = #{pwd,jdbcType=VARCHAR}
16     </select>
17 </mapper>

这里主要是根据用户名和密码查询一条数据,参数是前端传过来的,如果有则说明用户名密码正确;

3⃣️创建业务逻辑层接口

1 public interface UserService {
2 
3     public boolean checkUserInfo(String name, String pwd);
4 }

我的命名不太规范,其实命名成EmployeeService层次会比较分明,不过也无所谓,逻辑没问题就好了,还好😄

4⃣️创建业务逻辑实现类

 1 @Service("userService")
 2 public class UserServiceImpl implements UserService {
 3 
 4     @Autowired
 5     EmployeeMapper employeeMapper = null;
 6 
 7     @Override
 8     public boolean checkUserInfo(String name, String pwd) {
 9         boolean res = false;
10         Employee e = employeeMapper.getEmployByName(name, pwd);
11         res = null != e ? true : false;
12         return res;
13     }
14 
15 }

因为在controller中通过自动注解的方式获取了这个类的bean,所以此处使用注解@Service("userService")定义其名称。

好了,以上就是所有的配置和代码,下面通过页面访问login方法,如图:

正如在controller中配置的映射路径一样,访问时只要在基本路径中加上controller和方法的@@RequestMapping注解值即可;

因为我数据库中有一个名为张三,密码为zhangsan123的用户,所以我现在输入正确的用户名和密码看看结果:

从结果来看,当输入用户名密码点击登陆按钮时,请求URL变成了基本路径+controller+index方法的路径,并且登陆成功;下面输入一个错误的用户名呢?

输入李四之后页面继续停留在登陆页,至此,整个过程就完成了。这只是一个简单的例子,不过展示了整个Spring MVC项目搭建的完整流程,搭建过程中遇到了一些问题,其中需要注意的点我都在配置文件的注释中给出了。

posted @ 2018-10-02 22:25  bug改了我  阅读(820)  评论(0编辑  收藏  举报