您的位置:首页 > 编程语言 > Java开发

Spring Mvc+Spring+Mybatis的Maven项目搭建

2017-01-16 19:43 369 查看
一、搭建Maven环境,学习于http://www.cnblogs.com/sy270321/p/4723139.html 注:需要手动创建src/main/java和src/test/java 两个文件目录。

结果如下:test结构和main相同,test是用于测试的。



二、添加依赖

pom.xml 关于这个xml的详细解释,学习于http://blog.csdn.net/wangmuming/article/details/46915473

<?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"> <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->

<modelVersion>4.0.0</modelVersion>

<!-- groupId:项目或者组织的唯一标志,并且配置时生成路径也是由此生成,如org.myproject.mojo生成的相对路径为:/org/myproject/mojo -->
<groupId>com.gyt.hello</groupId>
<!-- 项目的通用名称 -->
<artifactId>hello-core</artifactId>
<!-- 打包机制,如pom,jar,maven-plugin,ejb,war,ear,rar,par -->
<packaging>war</packaging>
<!-- 项目的版本  SNAPSHOT表示快照,说明该项目还处于开发阶段,是不稳定版本-->
<version>0.0.1-SNAPSHOT</version>
<name>core-hello Maven Webapp</name>
<url>http://maven.apache.org</url>

<repositories>
<repository>
<id>oschinaRepository</id>
<name>local private nexus</name>
<url>http://maven.oschina.net/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<!-- 是用来指定当前包的依赖范围 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--springmvc json数据类型所需要的包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>

<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>

<dependency>
<groupId>common-itcast</groupId>
<artifactId>common-itcast</artifactId>
<version>1.4</version>
<scope>system</scope>
<!--本地jar的路径,相对或者绝对都可以-->
<systemPath>C:/Users/gyt/.m2/repository/common-itcast/common-itcast/1.4/itcast-tools-1.4.jar</systemPath>
</dependency>

<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<finalName>hello-core</finalName>
<plugins>
<!--  plugin元素包含描述插件所需要的信息。-->
<plugin>
<!-- 设置javac编译器的版本和编码字符 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf8</encoding> <!-- 编译器编码 -->
</configuration>
</plugin>
</plugins>

<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
<resources>
<resource>
<!--描述存放资源的目录,该路径相对POM路径。默认值${basedir}/src/main/resources -->
<directory>src/main/java</directory>
<!--用于指定要包括的文件。可以使用通配符*。例如**/*.xml。 -->
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>


三、将mybatis和springmvc整合

1、写数据库配置文件db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/secondbook
username=*
password=*
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000


2、applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开启aspectJ支持, 强制使用cglib实现动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 采用注解的方式配置bean -->
<context:annotation-config />
<!-- 配置要扫描的包 -->
<context:component-scan base-package="com.gyt.service"></context:component-scan>

<!-- 该 BeanPostProcessor 将自动对标注 @Autowired 的 Bean 进行注入 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties" />
</bean>

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:MyBatis.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>

<!-- Dao接口所在包名,Spring会自动查找其下的类 -->
<!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">-->
<!--<property name="basePackage" value="com.gyt.service"/>-->
<!--<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>-->
<!--</bean>-->

<!-- 配置mybatis数据处理的方式,共四种方式,这里采用MapperScannerConfigurer方式 -->
<!-- SqlSessionTemplate 这个需要写配置文件,在实现类中注入sqlsession,再使用sqlsession,是细颗粒控制
SqlSessionDaoSupport 这个只需要在实现类中继承特殊类就可以使用sqlsession MapperFactoryBean 这个要写配置文件,把对应的所有接口在配置文件中引用即可,无需写实现类
MapperScannerConfigurer 这个要写配置文件,只要给出接口所在的包即可,会自动把包中的接口引入,无需写实现类 -->

<!-- jdbc初始化数据库 -->
<!-- <jdbc:initialize-database data-source="dataSource" ignore-failures="NONE"
enabled="true"> <jdbc:script encoding="utf-8" location="/WEB-INF/db-init.sql"/>
</jdbc:initialize-database> -->

<!-- 配置哪些方法用什么样的事务,配置事务的传播特性 -->
<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes> <tx:method name="add" propagation="REQUIRED"/> </tx:attributes>
</tx:advice> <aop:config> <aop:pointcut id="pointcut" expression="execution(*
D1.serviceimpl.UserServiceImpl.*(..))" /> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
</aop:config> -->
<!-- 配置结束 -->

</beans>


3、mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD  Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 映射文件,存放sql语句的配置文件 -->
<mappers>
<mapper resource="com/gyt/mapping/userMappers.xml" ></mapper>
</mappers>
</configuration>


4、log4j.properties

log4j.rootLogger=info,A1
log4j.logger.com.mchange=warn,A1
log4j.additivity.com.mchange=false
log4j.logger.org.hibernate=warn,A1
log4j.additivity.org.hibernate=false
log4j.logger.com.ibatis=warn,A1
log4j.additivity.com.ibatis=false
# ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%c]-[%p] %m%n
# \u6253\u5370sql
log4j.logger.org.apache.ibatis=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
#com.frame
log4j.logger.com.frame=debug


四、整合springmvc

1、web.xml

<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<display-name>Spring MVC Application</display-name>

<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 应用上下文配置文件 -->
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!--对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.bmp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<jsp-config>
<taglib>
<taglib-uri>JSTL_C</taglib-uri>
<taglib-location>/resources/jstl/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>JSTL_FMT</taglib-uri>
<taglib-location>resources/jstl/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>JSTL_FN</taglib-uri>
<taglib-location>/resources/jstl/fn.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>JSTL_SQL</taglib-uri>
<taglib-location>/resources/jstl/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>JSTL_X</taglib-uri>
<taglib-location>/resources/jstl/x.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>


这里是把 DispatcherServlet 命名为HelloWeb,并且让它在 Web 项目一启动就加载。所以需要在/webapp/WEB-INF/目录下创建一个HelloWeb-servlet.xml的Spring配置文件。

Spring官方文档上推荐的默认的文件名是[servlet-name]-servlet.xml文件,这里 servlet-name 叫 HelloWeb,新建一个HelloWeb-servlet.xml。

2、HelloWeb-servlet.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:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--指明 controller 所在包,并扫描其中的注解-->
<context:component-scan base-package="com.gyt.controller" />

<!-- 开启注解 -->
<mvc:annotation-driven/>

<!--内部需要访问静态资源的时候,用于找到具体的资源所在-->
<mvc:resources location="/resources/js/" mapping="/js/**"></mvc:resources>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- InternalResourceViewResolver用于支持Servlet、JSP视图解析-->
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包-->
<property name="prefix" value="/WEB-INF/Pages/" /><!--前缀-->
<property name="suffix" value=".jsp" /><!--后缀-->
</bean>

</beans>


五、用户登录的springmvc+spring+mybatis例子

springmvc+spring+mybatis其实于struts2+spring+mybatis类似,所以只是在原来的基础上,把action改成了controller,注解什么的都是一样的,关于springmvc学习于http://www.cnblogs.com/sunniest/p/4555801.html.

1、实体类vo

user.java

package com.gyt.vo;

import com.gyt.vo.CustomerLevel;

public class User {
//与数据库对应数据
private String userno;
private String username;
private String password;
private String sex;
private String studentno;
private String telephone;
private String roomno;
private String customerlevelno;
private CustomerLevel customerlevel;

//与注册表单对应
private String repassword;
private String verifycode;

//修改表单
private String newpassword;

public String getUserno() {
return userno;
}

public void setUserno(String userno) {
this.userno = userno;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public String getStudentno() {
return studentno;
}

public void setStudentno(String studentno) {
this.studentno = studentno;
}

public String getTelephone() {
return telephone;
}

public void setTelephone(String telephone) {
this.telephone = telephone;
}

public String getRoomno() {
return roomno;
}

public void setRoomno(String roomno) {
this.roomno = roomno;
}

public String getRepassword() {
return repassword;
}

public void setRepassword(String repassword) {
this.repassword = repassword;
}

public String getVerifycode() {
return verifycode;
}

public void setVerifycode(String verifycode) {
this.verifycode = verifycode;
}

public String getNewpassword() {
return newpassword;
}

public void setNewpassword(String newpassword) {
this.newpassword = newpassword;
}

public String getCustomerlevelno() {
return customerlevelno;
}

public void setCustomerlevelno(String customerlevelno) {
this.customerlevelno = customerlevelno;
}

public CustomerLevel getCustomerlevel() {
return customerlevel;
}

public void setCustomerlevel(CustomerLevel customerlevel) {
this.customerlevel = customerlevel;
}

}


2、UserDao.java

package com.gyt.dao;
import com.gyt.vo.User;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.gyt.vo.CustomerLevel;

import java.util.Map;

@Repository
@Transactional
public interface UserDao{

/*** 检查是否注册***/
public int checkIfloginname(String loginname);
/***插入注册成功用户***/
public void addUser(User user);
/***查找登录用户密码***/
public String searchPass(String username);

/***根据用户名和密码查找是否存在***/
public String searchByPass(Map<String,String> map);
/***根据用户名修改密码***/
public int changePass(String userno,String repassword);

/***查询用户等级信息***/
public CustomerLevel searchDiscountLevel(String userno);

}


3、UserService.java

package com.gyt.service;

import com.gyt.vo.CustomerLevel;
import com.gyt.vo.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

public interface UserService {
/*** 检查是否注册***/
public int checkIfloginname(String loginname);
/***插入注册成功用户***/
public void addUser(User user);
/***查找登录用户密码***/
public String searchPass(String username);

/***根据用户名和密码查找是否存在***/
public String searchByPass(Map<String,String> map);
/***根据用户名修改密码***/
public int changePass(String userno,String repassword);

/***查询用户等级信息***/
public CustomerLevel searchDiscountLevel(String userno);

}


4、UserServiceImpl.java

package com.gyt.service.impl;

import com.gyt.vo.CustomerLevel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.gyt.service.UserService;
import com.gyt.dao.UserDao;
import com.gyt.vo.User;
import cn.itcast.commons.CommonUtils;

import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

private UserDao userdao;

public UserDao getUserdao() {
return userdao;
}

@Autowired
public void setUserdao(UserDao userdao) {
this.userdao = userdao;
}

/*** 检查是否注册***/
public int checkIfloginname(String loginname){
return userdao.checkIfloginname(loginname);
}
/*** 添加用户***/
public void addUser(User user){
String userno="Y"+CommonUtils.uuid().subSequence(0, 4).toString();
user.setUserno(userno);//随机产生用户编号
userdao.addUser(user);
}
/***查找登录用户密码 ***/
public String searchPass(String username){
return userdao.searchPass(username);

}
//  /***根据用户名查找用户***/
//  public User searchUser(String username){
//      User user=new User();
//      try {
//          dao.searchUser(username);
//      } catch (SQLException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
//      return user;
//
//  }

/***根据用户名和密码查找是否存在***/
public String searchByPass(Map<String,String> map){

return userdao.searchByPass(map);
}
/***根据用户名修改密码***/
public int changePass(String userno,String repassword){

return userdao.changePass(userno, repassword);

}
public CustomerLevel searchDiscountLevel(String userno) {
// TODO Auto-generated method stub
return userdao.searchDiscountLevel(userno);
}
}


5、UserController.java

package com.gyt.controller;

import com.gyt.service.UserService;
import com.gyt.vo.CustomerLevel;
import com.gyt.vo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
* Created by guiyuting on 2017/1/12.
*/
//@Controller注解用于标示本类为web层控制组件
@Controller
//@RequestMapping("/userLogin")用于标定访问时对url位置
@RequestMapping("/user")
//在默认情况下springmvc的实例都是单例模式,所以使用scope域将其注解为每次都创建一个新的实例
@Scope("prototype")
public class UserController {

//    @Qualifier(value="userserivce")
private UserService userservice;

public UserService getUserservice() {
return userservice;
}
//自动注入业务层的userService类
@Autowired
public void setUserservice(UserService userservice) {
this.userservice = userservice;
}

//login业务的访问位置为/user/login
//点击登录按钮验证
@RequestMapping("/login")
@ResponseBody
public void login(HttpServletRequest request,HttpServletResponse response,Map<String, Object> mapModel) throws ServletException, IOException {
User formuser = new User();
Map<String, Object> resultMap = new HashMap<String, Object>();
request.setCharacterEncoding("UTF-8");

//从表单获取验证码
String verifyCode = request.getParameter("verifyCode").toString();
formuser.setVerifycode(verifyCode);

//获取用户名
String username = request.getParameter("loginname").toString();
formuser.setUsername(username);

//获取密码
String password = request.getParameter("loginpass").toString();
System.out.println("LoginAction:" + password);
formuser.setPassword(password);
System.out.println(username+" "+password+" "+verifyCode);

if (userservice.checkIfloginname(username)==0) {

//            mapModel.put("msg", "该用户不存在!");
//            mapModel.put("loginForm", formuser);
request.setAttribute("msg", "该用户不存在!");
request.setAttribute("loginForm", formuser);
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("/Pages/Ables/User/Login.jsp");
requestDispatcher.forward(request, response);
//resultMap.put("result", "failure");

} else {
Map<String,String> map=new HashMap<String,String> ();
map.put("username", username);
map.put("password", password);
String str = userservice.searchByPass(map);
if (str == null) {
//                mapModel.put("msg", "密码错误!");
//                mapModel.put("loginForm", formuser);

request.setAttribute("msg", "密码错误!");
request.setAttribute("loginForm", formuser);
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("/Pages/Ables/User/Login.jsp");
requestDispatcher.forward(request, response);
//resultMap.put("result", "failure");
} else {
formuser.setUserno(str);
CustomerLevel level=new CustomerLevel();
level=userservice.searchDiscountLevel(str);
formuser.setCustomerlevel(level);

HttpSession session=request.getSession();
session.setAttribute("sessionUser", formuser);
User user = (User) session.getAttribute("sessionUser");
request.setAttribute("username", user.getUsername());
try {
username = URLEncoder.encode(username, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Cookie cookie = new Cookie("loginname", username);
cookie.setMaxAge(1000 * 60 * 60 * 60 * 10);
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("/Pages/Users/Main.jsp");
requestDispatcher.forward(request, response);
//resultMap.put("result","success");
}

}
// return resultMap;
}
//在登录页面时验证
@RequestMapping("/loginCheck")
@ResponseBody
public Map<String,Object> loginCheck(HttpServletRequest request,HttpServletResponse response,String loginname,String loginpass){
Map<String,String> map=new HashMap<String,String> ();
Map<String, Object> resultMap = new HashMap<String, Object>();
map.put("username", loginname);
map.put("password", loginpass);
//通过用户名和密码查找用户编号,若返回值不为空,则证明该用户存在,向页面传递true.
String str = userservice.searchByPass(map);
boolean b = false;
if (str == null) {
b = false;
}
else{
b = true;
}
resultMap.put("result",b);
return resultMap;
}

//验证码验证
@RequestMapping("/validateCheck")
@ResponseBody //此注解不能省略 否则ajax无法接受返回值
public Map<String,Object> validateCheck(HttpServletRequest request,String verifyCode) throws IOException {
Map<String, Object> resultMap = new HashMap<String, Object>();
//        String verifyCode = request.getAttribute("verifyCode").toString();
System.out.println("LoginServlet:verifyCode  " + verifyCode);
//          System.out.println("aaaaaa"+request.getSession().getId());
HttpSession session=request.getSession();
String v = session.getAttribute("vcode").toString();
System.out.println("LoginServlet:ValidateCode  " + v);
boolean b = v.equalsIgnoreCase(verifyCode);
System.out.println(b);
resultMap.put("result", b);
return resultMap;
}

}


6、userMappers.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gyt.dao.UserDao">
<!-- 1. id (必须配置) id是命名空间中的唯一标识符,可被用来代表这条语句。 一个命名空间(namespace) 对应一个dao接口,
这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致 -->
<!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理) 将要传入语句的参数的完全限定类名或别名, 如果不配置,mybatis会通过ParameterHandler
根据参数类型默认选择合适的typeHandler进行处理 parameterType 主要指定参数类型,可以是int, short, long,
string等类型,也可以是复杂类型(如对象) -->
<!-- 3. resultType (resultType 与 resultMap 二选一配置) resultType用以指定返回类型,指定的类型可以是基本类型,可以是java容器,也可以是javabean -->
<!-- 4. resultMap (resultType 与 resultMap 二选一配置) resultMap用于引用我们通过 resultMap标签定义的映射类型,这也是mybatis组件高级复杂映射的关键 -->
<!-- 5. flushCache (可选配置) 将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false -->
<!-- 6. useCache (可选配置) 将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true -->
<!-- 7. timeout (可选配置) 这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动) -->
<!-- 8. fetchSize (可选配置) 这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动) -->
<!-- 9. statementType (可选配置) STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis
分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED -->
<!-- 10. resultSetType (可选配置) FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE
中的一个,默认值为 unset (依赖驱动) -->

<!-- 检查是否注册 -->
<select id="checkIfloginname" parameterType="String" resultType="int">
select count(*) as loginnum from Customer where cusName=#{loginname}
</select>
<!-- 根据用户名和密码查找是否存在 -->
<select id="searchByPass" parameterType="String" resultType="String">
select CustomerNo  from Customer where cusName=#{username}
and cusPassword=#{password}
</select>
<!-- 插入注册成功用户 -->
<insert id="addUser" parameterType="com.gyt.vo.User">
insert into
Customer(CustomerNo,CusName,cusPassword,sex,stuNo,telephone,address)
values(#{userno},#{username},#{password},#{sex},#{studentno},#{telephone},#{roomno})
</insert>

<!-- 查找登录用户密码 -->
<select id="searchPass" parameterType="String" resultType="String">
select cusPassword as password from Customer where cusName=#{username}
</select>

<!-- 根据用户名修改密码 -->
<update id="changePass" parameterType="String">
update Customer
set
cusPassword=#{repassword}
where customerNo=#{userno}
</update>

<!--查询用户等级信息-->
<select id="searchDiscountLevel" resultType="com.gyt.vo.CustomerLevel">
select a.CustomerLevelNo as customerlevelno, a.CustomerLevelName as customerlevelname,a.cusDiscount as cusdiscount
from CustomerLevel a,Customer b
where a.CustomerLevelNo=b.CustomerLevelNo and b.CustomerNo=#{userno}
</select>
</mapper>


7、在mybatis.xml文件里添加userMapper映射文件,前面配置的时候已经写到,再写一次:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD  Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 映射文件,存放sql语句的配置文件 -->

<mappers>

<mapper resource="com/gyt/mapping/userMappers.xml" ></mapper>

<mapper resource="com/gyt/mapping/categoryMappers.xml" ></mapper>

<mapper resource="com/gyt/mapping/bookMappers.xml" ></mapper>

<mapper resource="com/gyt/mapping/carMappers.xml" ></mapper>

</mappers>

</configuration>


8、spring配置文件applicationContext.xml添加UserDao的bean

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="com.gyt.dao.UserDao" />
</bean>


9、Login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--<%@page language="java" contentType="text/html; charset=utf-8"%>--%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>登录</title>
<base href="<%=basePath%>">

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

<style type="text/css">
body {background-color: #f5f5f5;}
.main{margin-left: 250px; margin-top: 30px;}
.imageDiv{float: left;}
.img{width: 400px;}
.login1{width: 440px; height: 370px; border: 1px solid #d1d1cf; float: left; background-color: #f4f4f4;}
.login2{width:436px; height:366px; margin: 2px; background-color: #ffffff;}
.loginTopDiv {padding: 30px;}
.loginTop {color: #696969; font-size: 20px; font-weight: 900;}
table {margin-left: 30px;font-size: 10pt;color: #404040;}
.input {width: 235px;height: 26px;border: 1px solid #d9d9d9;padding-top: 4px;padding-left: 8px;}
.yzm {width: 90px;height: 26px;border: 1px solid #d9d9d9;vertical-align: middle; margin-right: 30px;padding-top: 4px;padding-left: 8px;}
label.error {color:#cc3300;font-weight: 900;}
#vCode {margin-right: 30px; vertical-align: middle;width: 70px;height: 26px;border: 1px solid #000;}
.loginBtn1 { background:url('resources/Images/User/login1.jpg') no-repeat;border: 0px; width: 92px; height: 27px;}
.loginBtn2 { background:url('resources/Images/User/login2.jpg') no-repeat;border: 0px; width: 92px; height: 27px;}
</style>
<script type="text/javascript" src="resources/js/jquery.js"></script>

<script type="text/javascript">//验证码
function _change() {
debugger;
$("#vCode").attr("src", "/core-hello/validateCode?" + new Date().getTime());
}
</script>
<script type="text/javascript">
$(function(){
$("#submitbtn").hover(
function(){
$("#submitbtn").attr("class","loginBtn1");
},
function(){
$("#submitbtn").attr("class","loginBtn2");
}

);
$(".input").focus(
function(){//得到焦点验证
var labelid=$(this).attr("id")+"Error";
$("#"+labelid).text("");
showError($("#"+labelid));

});
$(".input").blur(function(){//失去焦点

var inid="fun"+$(this).attr("id")+"()";
eval(inid);
});
//选择所有类为errorClass的元素,类选择器,each()遍历
$(".error").each(function(){
showError($(this));
});
function funloginname(){

var inid="loginname";
var v=$("#"+inid).val();
if(!v){
$("#"+inid+"Error").text("用户名不能为空!");
showError($("#"+inid+"Error"));
return false;
}
else if(v.length>20){
$("#"+inid+"Error").text("用户名长度在1-20!");
showError($("#"+inid+"Error"));
return false;
}
return true;
}
function funloginpass(){
var inid="loginpass";
var v=$("#"+inid).val();
if(!v){
$("#"+inid+"Error").text("密码不能为空!");
showError($("#"+inid+"Error"));
return false;
}
else if(v.length<2||v.length>10){
$("#"+inid+"Error").text("密码长度在2-9!");
showError($("#"+inid+"Error"));
return false;

}
var params = {};
params.loginname=$("#loginname").val();
params.loginpass=$("#loginpass").val();
$.ajax({
url:"/core-hello/user/loginCheck",
data:{loginname:$("#loginname").val(),loginpass:$("#loginpass").val()},
type:"POST",
dataType:"json",
async:false,
cache:false,
success:function(data){
if(!data.result){
$("#"+inid+"Error").text("密码错误!");
showError($("#"+inid+"Error"));
return false;
}
}

});
return true;
}
function funverifyCode(){
debugger;
var inid="verifyCode";
var v=$("#"+inid).val();
var params = {};
//params.XX必须与Spring Mvc controller中的参数名称一致
//否则在controller中使用@RequestParam绑定
params.verifyCode= v;
if(!v){
$("#"+inid+"Error").text("验证码不能为空!");
showError($("#"+inid+"Error"));
return false;
}
else if(v.length!=4){
$("#"+inid+"Error").text("验证码错误!");
showError($("#"+inid+"Error"));
return false;

}
$.ajax({
url:"user/validateCheck",
data:params,
type:"POST",
dataType:"json",
async:false,
cache:false,
success:function(data){
if(!data.result){
$("#"+inid+"Error").text("验证码错误!");
showError($("#"+inid+"Error"));
return false;
}
}

});
return true;

}
function showError(ele){
var text=ele.text();
if(text){
ele.css("display","");
}
else{
ele.css("display","none");
}
}
//$("#submitbtn").click(
//      function toSubmit() {
//
//          debugger;
//          var bool = true;
//          var bName=funloginname();
//          var bPass=funloginpass();
//          var bCode=funverifyCode();
//          if (!bName) {
//              bool = false;
//          }
//          if (!bPass) {
//              bool = false;
//          }
//          if (!bCode) {
//              bool = false;
//          }
//          $("#loginForm").submit;
//          return bool;
//          //if(bool){
//          //  alert(bool);
//          //window.location.href="user/LoginAction";
//          //document.getElementById("loginForm").submit();
//
//          //}
//  });

});

</script>
</head>
<body>
<div class="main">
<div>
<div class="login1">
<div class="login2">
<div class="loginTopDiv">
<span class="loginTop">用户登录</span>
<span>
<a href="Pages/Ables/User/Register.jsp" class="registBtn"></a>
</span>
</div>
<div>
<form target="_top" action="user/login" method="post" id="loginForm">
<%--<input type="hidden" name="method" value="userLogin" />--%>
<table>
<tr>
<td width="50"></td>
<td><label class="error" id="msg"></label></td>
</tr>
<tr>
<td width="50">用户名:</td>
<td><input class="input" type="text" name="loginname" id="loginname" value="${loginForm.username}"/></td>
</tr>
<tr>
<td height="20"> </td>
<td><label id="loginnameError" class="error"></label></td>
</tr>
<tr>
<td>密 码:</td>
<td><input class="input" type="password" name="loginpass" id="loginpass" value="${loginForm.password}"/></td>
</tr>
<tr>
<td height="20"> </td>
<td><label id="loginpassError" class="error"></label></td>
</tr>
<tr>
<td>验证码:</td>
<td>
<input class="input yzm" type="text" name="verifyCode" id="verifyCode" value="${loginForm.verifycode}"/>
<img id="vCode" src="/core-hello/validateCode"/>
<a href="javascript: _change()" >换一张</a>
</td>
</tr>
<tr>
<td height="20px"> </td>
<td><label id="verifyCodeError" class="error"></label></td>
</tr>
<tr>
<td> </td>
<%--<td align="left"><input type="button" name="submitbtn"--%>
<%--id="submitbtn" class="loginBtn2" value="" />--%>
<%--</td>--%>
<td align="left"><input type="submit" name="submitbtn"
id="submitbtn" class="loginBtn2" value="" />
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>


10、可测试成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: