zoukankan      html  css  js  c++  java
  • Spring学习进阶(一)初识Spring

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5   <modelVersion>4.0.0</modelVersion>
     6   <groupId>com.smart</groupId>
     7   <artifactId>chapter</artifactId>
     8   <packaging>pom</packaging>
     9   <version>3.1-SNAPSHOT</version>
    10   <name>Spring3.1 </name>
    11   <description>Spring3.1</description>
    12   <properties>
    13     <file.encoding>UTF-8</file.encoding>
    14     <java.version>1.6</java.version>
    15     <spring.action.version>3.1-SNAPSHOT</spring.action.version>
    16     <org.springframework.version>3.1.1.RELEASE</org.springframework.version>
    17     <mysql.version>5.1.6</mysql.version>
    18     <commons-dbcp.version>1.2.2</commons-dbcp.version>
    19     <aspectjweaver.version>1.6.9</aspectjweaver.version>
    20     <apache.commons.version>1.1.1</apache.commons.version>
    21     <commons-collections.version>3.2.1</commons-collections.version>
    22     <javassist.version>3.9.0.GA</javassist.version>
    23     <commons-beanutils.version>1.8.3</commons-beanutils.version>
    24     <ehcache.version>1.6.2</ehcache.version>
    25     <hibernate.version>3.6.10.Final</hibernate.version>
    26     <hibernate-validator.version>4.0.2.GA</hibernate-validator.version>
    27     <slf4j-jdk14.version>1.6.1</slf4j-jdk14.version>
    28 
    29     <commons-fileupload.version>1.2.1</commons-fileupload.version>
    30     <jsp-api.version>2.0</jsp-api.version>
    31     <servlet-api.version>2.5</servlet-api.version>
    32     <jstl.version>1.2</jstl.version>
    33     <standard.version>1.1.2</standard.version>
    34     <freemarker.version>2.3.8</freemarker.version>
    35     <jetty.version>6.1.5</jetty.version>
    36 
    37     <mockito-all.version>1.8.5</mockito-all.version>
    38     <junit.version>4.9.0</junit.version>
    39     <testng.version>6.3.1</testng.version>
    40     <unitils.version>3.1</unitils.version>
    41     <dbunit.version>2.4.8</dbunit.version>
    42   </properties>
    43   <modules>
    44     <module>chapter1</module>
    45     <!--<module>chapter2</module>
    46     <module>chapter3</module>
    47     <module>chapter4</module>
    48     <module>chapter5</module>
    49     <module>chapter6</module>
    50     <module>chapter7</module>
    51     <module>chapter8</module>
    52     <module>chapter9</module>
    53     <module>chapter11</module>-->
    54   </modules>
    55   <build>
    56     <plugins>
    57       <plugin>
    58         <artifactId>maven-surefire-plugin</artifactId>
    59         <configuration>
    60           <skip>true</skip>
    61         </configuration>
    62       </plugin>
    63     </plugins>
    64   </build>
    65 </project>

    chapter:pom.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <project xmlns="http://maven.apache.org/POM/4.0.0"
      3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5     <parent>
      6         <groupId>com.smart</groupId>
      7         <artifactId>chapter</artifactId>
      8         <version>3.1-SNAPSHOT</version>
      9     </parent>
     10     <modelVersion>4.0.0</modelVersion>
     11     <artifactId>chapter1</artifactId>
     12     <version>3.1-SNAPSHOT</version>
     13     <name>第一章示例</name>
     14     <description>Spring 快速入门</description>
     15     <packaging>war</packaging>
     16     <dependencies>
     17         <!--① 依赖的Spring模块类库 -->
     18         <dependency>
     19             <groupId>org.springframework</groupId>
     20             <artifactId>spring-beans</artifactId>
     21             <version>${org.springframework.version}</version>
     22         </dependency>
     23         <dependency>
     24             <groupId>org.springframework</groupId>
     25             <artifactId>spring-jdbc</artifactId>
     26             <version>${org.springframework.version}</version>
     27         </dependency>
     28         <dependency>
     29             <groupId>org.springframework</groupId>
     30             <artifactId>spring-web</artifactId>
     31             <version>${org.springframework.version}</version>
     32         </dependency>
     33         <dependency>
     34             <groupId>org.springframework</groupId>
     35             <artifactId>spring-webmvc</artifactId>
     36             <version>${org.springframework.version}</version>
     37         </dependency>
     38         <!--② 依赖的持久化类库-->
     39         <dependency>
     40             <groupId>mysql</groupId>
     41             <artifactId>mysql-connector-java</artifactId>
     42             <version>${mysql.version}</version>
     43         </dependency>
     44         <!--③ 依赖的公共类库-->
     45         <dependency>
     46             <groupId>commons-dbcp</groupId>
     47             <artifactId>commons-dbcp</artifactId>
     48             <version>${commons-dbcp.version}</version>
     49         </dependency>
     50         <dependency>
     51             <groupId>org.aspectj</groupId>
     52             <artifactId>aspectjweaver</artifactId>
     53             <version>${aspectjweaver.version}</version>
     54         </dependency>
     55         <!--④ 依赖的WEB类库-->
     56         <dependency>
     57             <groupId>javax.servlet.jsp</groupId>
     58             <artifactId>jsp-api</artifactId>
     59             <version>${jsp-api.version}</version>
     60            <scope>provided</scope>
     61         </dependency>
     62         <dependency>
     63             <groupId>taglibs</groupId>
     64             <artifactId>standard</artifactId>
     65             <version>${standard.version}</version>
     66             <scope>runtime</scope>
     67         </dependency>
     68         <dependency>
     69             <groupId>javax.servlet</groupId>
     70             <artifactId>servlet-api</artifactId>
     71             <version>${servlet-api.version}</version>
     72         </dependency>
     73         <dependency>
     74             <groupId>javax.servlet</groupId>
     75             <artifactId>jstl</artifactId>
     76             <version>${jstl.version}</version>
     77         </dependency>
     78         <!--⑤ 依赖的测试类库-->
     79         <dependency>
     80             <groupId>org.springframework</groupId>
     81             <artifactId>spring-test</artifactId>
     82             <version>${org.springframework.version}</version>
     83         </dependency>
     84         <dependency>
     85             <groupId>org.testng</groupId>
     86             <artifactId>testng</artifactId>
     87             <version>${testng.version}</version>
     88         </dependency>
     89         <dependency>
     90             <groupId>cglib</groupId>
     91             <artifactId>cglib</artifactId>
     92             <version>1.0</version>
     93         </dependency>
     94         <dependency>
     95             <groupId>commons-logging</groupId>
     96             <artifactId>commons-logging</artifactId>
     97             <version>1.1</version>
     98         </dependency>
     99     </dependencies>
    100     <build>
    101         <finalName>chapter1</finalName>
    102         <plugins>
    103             <plugin>
    104                 <artifactId>maven-surefire-plugin</artifactId>
    105                 <configuration>
    106                     <skip>true</skip>
    107                 </configuration>
    108             </plugin>
    109             <!-- jetty插件 -->
    110             <plugin>
    111                 <groupId>org.mortbay.jetty</groupId>
    112                 <artifactId>maven-jetty-plugin</artifactId>
    113                 <version>6.1.5</version>
    114                 <configuration>
    115                     <webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
    116                     <scanIntervalSeconds>3</scanIntervalSeconds>
    117                     <contextPath>/chapter1</contextPath>
    118                     <connectors>
    119                         <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
    120                             <port>8088</port>
    121                         </connector>
    122                     </connectors>
    123                 </configuration>
    124             </plugin>
    125         </plugins>
    126     </build>
    127 </project>

    chapter1 pom.xml

     1 package com.smart.domain;
     2 
     3 import java.io.Serializable;
     4 import java.util.*;
     5 /**
     6  * Created by sanglp on 2016/6/29.
     7  */
     8 
     9 /**
    10  * domain对象一般要实现Serializable接口,以便进行序列化
    11  */
    12 public class User implements Serializable {
    13    private int userId;
    14    private String userName;
    15     private String password;
    16     private String lastIp;
    17     private Date lastVisit;
    18 
    19     public int getUserId() {
    20         return userId;
    21     }
    22 
    23     public String getUserName() {
    24         return userName;
    25     }
    26 
    27     public String getPassword() {
    28         return password;
    29     }
    30 
    31     public String getLastIp() {
    32         return lastIp;
    33     }
    34 
    35     public Date getLastVisit() {
    36         return lastVisit;
    37     }
    38 
    39     public void setUserId(int userId) {
    40         this.userId = userId;
    41     }
    42 
    43     public void setUserName(String userName) {
    44         this.userName = userName;
    45     }
    46 
    47     public void setPassword(String password) {
    48         this.password = password;
    49     }
    50 
    51     public void setLastIp(String lastIp) {
    52         this.lastIp = lastIp;
    53     }
    54 
    55     public void setLastVisit(Date lastVisit) {
    56         this.lastVisit = lastVisit;
    57     }
    58 }

    User.java

     1 package com.smart.domain;
     2 
     3 /**
     4  * Created by sanglp on 2016/6/29.
     5  */
     6 import java.util.*;
     7 public class LoginLog {
     8     private int loginLogId;
     9     private int userId;
    10     private String ip;
    11     private Date loginDate;
    12 
    13     public int getLoginLogId() {
    14         return loginLogId;
    15     }
    16 
    17     public int getUserId() {
    18         return userId;
    19     }
    20 
    21     public String getIp() {
    22         return ip;
    23     }
    24 
    25     public Date getLoginDate() {
    26         return loginDate;
    27     }
    28 
    29     public void setLoginLogId(int loginLogId) {
    30         this.loginLogId = loginLogId;
    31     }
    32 
    33     public void setUserId(int userId) {
    34         this.userId = userId;
    35     }
    36 
    37     public void setIp(String ip) {
    38         this.ip = ip;
    39     }
    40 
    41     public void setLoginDate(Date loginDate) {
    42         this.loginDate = loginDate;
    43     }
    44 }

    LoginLog.java

     1 package com.smart.dao;
     2 
     3 import com.smart.domain.User;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.jdbc.core.JdbcTemplate;
     6 import org.springframework.jdbc.core.RowCallbackHandler;
     7 import org.springframework.stereotype.Repository;
     8 
     9 import java.sql.ResultSet;
    10 import java.sql.SQLException;
    11 
    12 /**
    13  * Created by sanglp on 2016/6/29.
    14  */
    15 //通过Spring注解定义一个DAO
    16 @Repository
    17 public class UserDao {
    18     //自动注入JdbcTemplate的Bean
    19     @Autowired
    20     private JdbcTemplate jdbcTemplate;
    21     //根据用户名和密码获取匹配的用户数。等于1表示用户名/密码正确,等于0表示用户名或密码错误
    22     public int getMatchCount(String userName ,String password){
    23         String sqlStr="select count(*) FROM t_user where user_name=? and password=?";
    24         return jdbcTemplate.queryForInt(sqlStr,new Object[]{userName,password});
    25     }
    26 
    27     /**
    28      * 通过调用RowCallbackHandler回调接口实例,将ResultSet转换为User对象
    29      * @param userName
    30      * @return
    31      */
    32     public User findUserByUserName(final String userName){
    33         String sqlStr="SELECT user_id,user_name FROM t_user WHERE user_name=?";
    34         final  User user=new User();
    35         jdbcTemplate.query(sqlStr, new Object[]{userName},
    36                 new RowCallbackHandler() {  //匿名类方式实现的回调函数
    37                     //processRow负责将查询的结果congenialResultSet装载到类似于领域对象的对象示例中
    38                     public void processRow(ResultSet resultSet) throws SQLException {
    39                         user.setUserId(resultSet.getInt("user_id"));
    40                         user.setUserName(userName);
    41                     }
    42                 });
    43         return user;
    44     }
    45 
    46     public void updateLoginInfo (User user){
    47         String sqlStr="UPDATE t_user SET last_visit=?,last_ip=? WHERE user_id=?";
    48         jdbcTemplate.update(sqlStr,new Object[]{user.getLastVisit(),user.getLastIp(),user.getUserId()});
    49     }
    50 
    51 }

    UserDao.java

     1 package com.smart.dao;
     2 
     3 import com.smart.domain.LoginLog;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.jdbc.core.JdbcTemplate;
     6 import org.springframework.stereotype.Repository;
     7 
     8 import java.io.Serializable;
     9 
    10 /**
    11  * Created by sanglp on 2016/6/29.
    12  */
    13 @Repository
    14 public class LoginLogDao implements Serializable{
    15     @Autowired
    16     private JdbcTemplate jdbcTemplate;
    17 
    18     public void insertLoginLog(LoginLog loginLog){
    19         String sqlStr="INSERT INTO t_login_log(user_id,ip,login_datetime) VALUES(?,?,?)";
    20         jdbcTemplate.update(sqlStr,new Object[]{loginLog.getUserId(),loginLog.getIp(),loginLog.getLoginDate()});
    21     }
    22 }

    LoginLogDao.java

    1 在UserDao和LoginLogDao实现类中都没有打开/释放Connection的代码,那么DAO如何访问数据库?
    2 答:样板式的操作都被JdbcTemplate给封装起来了,JdbcTemplate本身需要一个DateSource,这样他就可以根据需要congenialDataSource中获取或返回连接。
    3 UserDao和LoginLogDao都提供了一个带@Autowried注解的JdbcTemplate变量。所以必须事先声明一个数据源,然后定义一个JdbcTemplate Bean,通过Spring的
    4 容器上下文自动绑定机制进行Bean的注入。

    在Spring中装载DAO

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <!--引用Spring的多个Schema空间格式定义文件-->
     3     <beans xmlns="http://www.springframework.org/schema/beans"
     4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5         xmlns:p="http://www.springframework.org/schema/p"
     6        xmlns:context="http://www.springframework.org/schema/context"
     7        xmlns:aop="http://www.springframework.org/schema/aop"
     8         xmlns:tx="http://www.springframework.org/schema/tx"
     9        xsi:schemaLocation="http://www.springframework.org/schema/beans
    10        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    11        http://www.springframework.org/schema/context
    12        http://www.springframework.org/schema/context/spring-context-3.1.xsd
    13        http://www.springframework.org/schema/tx
    14        http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    15        http://www.springframework.org/schema/aop
    16        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    17 
    18     <!--扫描包类,将标注Spring注解的类自动转化Bean,同时完成Bean的注入-->
    19     <!--使用Spring的context:component-scan扫描指定类包下的所有类,这样在类中定义的Spring注解(@Repository和@Autowired等才能产生作用)-->
    20     <context:component-scan base-package="com.smart.dao"/>
    21     <!--扫描service类包,应用Spring的注解配置-->
    22     <context:component-scan base-package="com.smart.service"/>
    23     <!--定义一个使用DBCP实现的数据源-->
    24     <!--使用Jakarta的DBCP开源数据源实现方案定义个一个数据源并设置驱动,端口用户名密码-->
    25     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    26           destroy-method="close"
    27           p:driverClassName="com.mysql.jdbc.Driver"
    28           p:url="jdbc:mysql://localhost:3306/sampledb"
    29           p:username="root"
    30           p:password="123456"/>
    31 
    32     <!--定义JDBC模板Bean-->
    33     <!--配置JdbcTemplate将上面声明的dataSource注入JdbcTemplate中,而这个JdbcTemplate将通过@Autowired自动注入LoginLogDao和UserDao的Bean中-->
    34     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    35           p:dataSource-ref="dataSource"/>
    36     <!--配置事务管理器 定义了基于数据源的DataSourceTransactionManager事务管理器,该事务管理器负责声明式事务的管理,该管理器需要引用dataSource Bean-->
    37     <bean id="transactionManager"
    38           class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/>
    39 
    40     <!--通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务-->
    41     <aop:config proxy-target-class="true">
    42         <aop:pointcut id="serviceMethod" expression=" execution(* com.smart.service..*(..))"/>
    43         <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
    44     </aop:config>
    45     <tx:advice id="txAdvice" transaction-manager="transactionManager">
    46         <tx:attributes>
    47             <tx:method name="*"/>
    48         </tx:attributes>
    49     </tx:advice>
    50     </beans>

    ApplicationContext.xml

     1 package com.smart.service;
     2 
     3 import com.smart.dao.LoginLogDao;
     4 import com.smart.dao.UserDao;
     5 import com.smart.domain.LoginLog;
     6 import com.smart.domain.User;
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.stereotype.Service;
     9 
    10 /**
    11  * Created by sanglp on 2016/6/30.
    12  */
    13 
    14 
    15 //通过@Service注解将UserService标注为一个服务层的Bean,
    16 @Service
    17 public class UserService {
    18     @Autowired
    19     private UserDao userDao;
    20     @Autowired
    21     private LoginLogDao loginLogDao;
    22 
    23     public boolean hasMatchUser(String userName,String password){
    24         int matchCount=userDao.getMatchCount(userName,password);
    25         return matchCount > 0;
    26     }
    27 
    28     public User findUserByUserName(String userName){
    29         return userDao.findUserByUserName(userName);
    30     }
    31 
    32     public void loginSuccess(User user){
    33         LoginLog loginLog=new LoginLog();
    34         loginLog.setUserId(user.getUserId());
    35         loginLog.setIp(user.getLastIp());
    36         loginLog.setLoginDate(user.getLastVisit());
    37         loginLogDao.insertLoginLog(loginLog);
    38 
    39     }
    40 }

    UserService.java

     1 package com.smart.service;
     2 
     3 import com.smart.domain.User;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.test.context.ContextConfiguration;
     6 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
     7 import org.testng.annotations.Test;
     8 
     9 import javax.jws.soap.SOAPBinding;
    10 
    11 import java.util.Date;
    12 
    13 import static org.testng.Assert.*;
    14 /**
    15  * Created by sanglp on 2016/6/30.
    16  * Spring3.1的测试框架可以和TestNG整合,通过Spring提供的测试基类AbatractTestNGSpringContextTests,可以将Spring
    17  * 容器和TestNG测试框架整合。@ContextConfiguration也是Spring提供的注解,它用于指定Spring的配置文件。
    18  * 在测试类中可以使用Spring的@Autowired将Spring容器中的Bean注入测试类中。在测试方法前通过TestNG的@Test注解即可将方法标注为测试方法。
    19  */
    20 //启动Spring容器
    21 @ContextConfiguration(locations ={"/applicationContext.xml"})
    22 //基于TestNG的Spring测试框架
    23 public class UserServiceTest extends AbstractTestNGSpringContextTests {
    24     @Autowired
    25     private UserService userService;
    26 
    27     //标注测试方法
    28     @Test
    29     public void hasMatchUser(){
    30         boolean b1=userService.hasMatchUser("admin","123456");
    31         boolean b2=userService.hasMatchUser("admin","1111");
    32         assertTrue(b1);
    33 
    34     }
    35 
    36     @Test
    37     public void findUserByUserName(){
    38         User user =userService.findUserByUserName("admin");
    39         assertEquals(user.getUserName(),"admin");
    40     }
    41 
    42     @Test
    43     public void loginSuccess(){
    44         User user=userService.findUserByUserName("admin");
    45         user.setUserId(1);
    46         user.setUserName("admin");
    47         user.setLastIp("192.168.12.7");
    48         user.setLastVisit(new Date());
    49         userService.loginSuccess(user);
    50     }
    51 }

    UserServiceTest.java

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <web-app version="2.5"
     3          xmlns="http://java.sun.com/xml/ns/javaee"
     4          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     6   <context-param>
     7     <!--从类路径下加载spring配置文件,classpath关键字特指在类路径下加载-->
     8     <param-name>contextConfigLocation</param-name>
     9     <param-value>classpath:applicationContext.xml</param-value>
    10   </context-param>
    11   <listener>
    12     <!--负责启动spring的容器的监听器,他将引用处的上下文参数获得spring配置文件地址-->
    13     <listener-class>
    14       org.springframework.web.context.ContextLoaderListener
    15     </listener-class>
    16   </listener>
    17   <!--spring mvc的主控Servlet-->
    18   <servlet>
    19     <!--Spring mvc也拥有一个spring配置文件,配置文件的文件名和此处定义的servlet名有一个契约,即采用<servlet名>-servlet.xml 因为这里为viewspace所以/WEB-INF目录下必须有一个VIEWSPACE-SERVLET.XMLL-->
    20     <servlet-name>viewspace</servlet-name>
    21     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    22     <load-on-startup>3</load-on-startup>
    23   </servlet>
    24   <!--spring mvc处理的URL-->
    25   <servlet-mapping>
    26     <servlet-name>viewspace</servlet-name>
    27     <url-pattern>*.html</url-pattern>
    28   </servlet-mapping>
    29 </web-app>

    web.xml配置Spring MVC

     1 package com.smart.web;
     2 
     3 import com.smart.domain.User;
     4 import com.smart.service.UserService;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.stereotype.Controller;
     7 import org.springframework.web.bind.annotation.RequestMapping;
     8 import org.springframework.web.servlet.ModelAndView;
     9 
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 import java.util.Date;
    13 
    14 /**
    15  * Created by sanglp on 2016/7/5.
    16  */
    17 /**
    18  * Spring mvc的@Controller注解可以将任何一个POJO的类标注为Spring MVC的控制器,处理HTTP请求,当然标注 了@Controller的类首先会是一个Bean,所以可以使用@Autowired进行Bean的注入
    19  * 一个控制器可以拥有多个对应不同HTTP请求路径的处理方法,通过@RequestMapping指定方法如何映射请求路径
    20  * 请求的参数会根据参数默认契约自动绑定到响应方法的入参中,在loginCheck方法中请求参数会按名称匹配绑定到loginCommand的入参中。
    21  * 请求响应犯法会返回一个ModelAndView或直接返回一个字符串,Spring MVC会解析之并转向目标响应页面。
    22  * ModelAndView对象既包括了视图信息又包括偶了视图渲染所需要的模型数据信息。
    23  */
    24 //标注为一个controller
    25 @Controller
    26 @RequestMapping(value="/admin")
    27 public class LoginController {
    28 
    29     @Autowired
    30     public UserService userService;
    31     @RequestMapping(value = "/login.html") //负责处理login.html的请求
    32     public  String loginPage(){
    33         return "login";
    34     }
    35 
    36     /**
    37      * 控制器根据登录处理结果分别返回ModelAndView("login","error","用户名或密码错误")和ModelAndView("main")ModelAndView的第一个参数带包视图的逻辑名
    38      * 第二个和第三个参数分别为数据模型名称和数据模型对象,数据模型对象将以数据模型名称为参数名放置到request的属性中
    39      * @param request
    40      * @param loginCommand
    41      * @return
    42      */
    43     @RequestMapping(value = "/loginCheck.html")
    44     public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
    45         boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(),loginCommand.getPassword());
    46 
    47         if(!isValidUser){
    48             return new ModelAndView("login","error","用户名或密码错误");
    49         }else{
    50             User user=userService.findUserByUserName(loginCommand.getUserName());
    51             user.setLastIp(request.getRemoteAddr());
    52             user.setLastVisit(new Date());
    53             userService.loginSuccess(user);
    54             request.getSession().setAttribute("user",user);
    55             return  new ModelAndView("main");
    56         }
    57     }
    58 }

    LoginController.java

     1 package com.smart.web;
     2 
     3 /**
     4  * Created by sanglp on 2016/7/5.
     5  */
     6 public class LoginCommand {
     7     private  String userName;
     8     private String password;
     9 
    10     public String getUserName() {
    11         return userName;
    12     }
    13 
    14     public String getPassword() {
    15         return password;
    16     }
    17 
    18     public void setUserName(String userName) {
    19         this.userName = userName;
    20     }
    21 
    22     public void setPassword(String password) {
    23         this.password = password;
    24     }
    25 }

    LoginCommand.java

     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" xmlns:p="http://www.springframework.org/schema/p"
     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-3.1.xsd
     7        http://www.springframework.org/schema/context
     8        http://www.springframework.org/schema/context/spring-context-3.1.xsd">
     9     <!--扫描相应的包,应用spring注解-->
    10     <context:component-scan base-package="com.smart.web"/>
    11     <bean id="defaultAnnotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    12     <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    13 
    14     <!--配置视图解析器,将ModelAndView及字符串解析为具体的页眉 在这里我们使用了InternalResourceViewResolver的视图映射方式,他通过添加前后缀来进行解析-->
    15     <!--Springmvc如何将视图逻辑名解析为具体的视图页眉呢? 通过prefix指定在视图名前所添加的前缀,通过suffix指定在视图名后添加的后缀-->
    16    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    17          p:viewClass="org.springframework.web.servlet.view.JstlView"
    18          p:prefix="/WEB-INF/jsp/"
    19          p:suffix=".jsp"/>
    20     </beans>

    viewspace-servlet.xml

     1 <%@ page language="java" contentType="text/html" charset="UTF-8" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
     3 <html>
     4 <head>
     5 <title>景区网站登录</title>
     6 </head>
     7 <body>
     8 <c:if test="${!empty error}">
     9 <!--使用JSTL标签对登录返回的信息进行错误处理,JSTL标签中引用了error变量,这个变量正是LoginController中返回的ModelAndView("login","error","用户名或密码错误")对象所声明的error参数-->
    10 <font color="red"><c:out value="${error}"/></font>
    11 </c:if>
    12 <!--login.jsp登录表单提交到loginController.html JSTL标签会在URL前自动加上应用程序部署根目录,假设应用部署在网站的viewspace目录下,标签将输出/viewspace/loginController.html
    13 由于login.jsp放在WEB-INF/jsp目录下,无法直接通过URL进行调用,他由LoginController控制类中标注了@RequestMapping(value="/login.html")的loginPage()进行转发-->
    14 <form action="<c:url value="/loginCheck.html"/>" method="post">
    15 用户名:
    16 <input type="text" name="userName">
    17 <br/>
    18 密码:
    19 <input type="password" name="password">
    20 <br/>
    21 <input type="submit" value="登录"/>
    22 <input type="reset" value="重置"/>
    23 </form>
    24 </body>
    25 </html>

    login.jsp

     1 <%@ page language="java" contentType="text/html" charset="UTF-8" pageEncoding="UTF-8"%>
     2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
     3 <html>
     4 <head>
     5 <title>景区后台管理主页面</title>
     6 </head>
     7 <body>
     8 <!--访问Session域中的user对象,显示用户名和积分信息-->
     9 ${user.userName},欢迎您进入景区管理后台!
    10 </body>
    11 </html>

    main.jsp

    jetty无法启动使用:mvn org.mertbay.jetty:maven-jetty-plugin:run

  • 相关阅读:
    测试PHP-FPM的工作流中的疑惑点
    摘要
    Centrifugo简单试用
    react-redux的基本用法
    PHP中使用ElasticSearch(二)
    PHP中使用ElasticSearch(一)
    Vue中的状态管理器
    Laravel数据库迁移
    快速搭建一个vue开发环境
    使用cURL尝试ElasticSearch
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/5655247.html
Copyright © 2011-2022 走看看