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
三、将mybatis和springmvc整合
1、写数据库配置文件db.properties
2、applicationContext.xml
3、mybatis.xml
4、log4j.properties
四、整合springmvc
1、web.xml
这里是把 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
五、用户登录的springmvc+spring+mybatis例子
springmvc+spring+mybatis其实于struts2+spring+mybatis类似,所以只是在原来的基础上,把action改成了controller,注解什么的都是一样的,关于springmvc学习于http://www.cnblogs.com/sunniest/p/4555801.html.
1、实体类vo
user.java
2、UserDao.java
3、UserService.java
4、UserServiceImpl.java
5、UserController.java
6、userMappers.xml
7、在mybatis.xml文件里添加userMapper映射文件,前面配置的时候已经写到,再写一次:
8、spring配置文件applicationContext.xml添加UserDao的bean
9、Login.jsp
10、可测试成功。
结果如下: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、可测试成功。
相关文章推荐
- java基础练习 1
- JDK下Bin目录的工具介绍
- 【Struts2】Action接收参数的三种方式
- Java异常抛出及自定义异常
- spring-mvc + shiro框架整合(sonne_game网站开发04)
- java通过commons-net上传文件到ftp服务器
- Java线程
- Java消息队列-Spring整合ActiveMq
- java缓存框架---ehcache简单实例
- struts.xml
- 【Struts2】——认识及环境搭建
- Java多线程编程:Callable、Future和FutureTask浅析
- java Clob 问题解决
- spring boot+Mybatis
- java基础
- springmvc拦截器
- java map hashmap linkedhashmap hashtable treemap
- Eclipse Jee Oxygen 导入maven项目
- springMVC源码解析--ViewResolver视图解析器执行(三)
- springMVC源码解析--ViewResolver视图解析器执行(三)