Javaweb 框架Spring+SpringMVc+Mybatis 简单环境搭建
一、需求
用 SSM实现简单的用户登录
二、开发环境准备
1、所需jar包 截图

2、所需配置文件
2.1、 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVCMybatisDemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name>
//初始化加载applicationContext.xml 配置文件
<param-value>classpath*:config/spring/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 解决post乱码 --> <filter> <filter-name>CharacterEncodingFilter</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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
2.2、Springmvc.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- 可以扫描controller、service、... 这里让扫描controller,指定controller的包 --> <context:component-scan base-package="com.wwx.*"></context:component-scan> <!--注解映射器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> --> <!--注解适配器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> --> <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法, 比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter 实际开发时使用mvc:annotation-driven --> <mvc:annotation-driven> <!-- 消息转换器 --> <!-- 解决@ResponseBody中文乱码 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8" /> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 视图解析器 解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置jsp路径的前缀 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 配置jsp路径的后缀 --> <property name="suffix" value=".jsp"/> </bean> </beans>
2.3、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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> <!-- 1. 数据源 : DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="wwx123123" /> </bean> <!-- 2. mybatis的SqlSession的工厂: SqlSessionFactoryBean dataSource:引用数据源 MyBatis定义数据源,同意加载配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 3. mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory basePackage:指定sql映射文件/接口所在的包(自动扫描) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.wwx.mapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> <!-- 4. 事务管理 : DataSourceTransactionManager dataSource:引用上面定义的数据源 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 5. 使用声明式事务 transaction-manager:引用上面定义的事务管理器 --> <tx:annotation-driven transaction-manager="txManager" /> </beans>
2.4、log4j.properties
log4j.rootLogger=debug, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.appender.A2.File=./javalog.log //\u6587\u4EF6\u8F93\u51FA ,\u8868\u793A\u5728\u9879\u76EE\u7684\u6839\u4E0B\u5EFA\u7ACB\u65E5\u5FD7\u6587\u4EF6
log4j.appender.A2.MaxFileSize = 1KB
log4j.appender.A2.MaxBackupIndex = 3 //\u5907\u4EFD3\u4E2A\u6587\u4EF6
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
开启log4j的好处之一就是控制台能打印 当前操作的sql语句和参数 信息以及异常
开启日志记录 还需 在web.xml 中加入
<!--设置log4j的配置文件位置--> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j.properties</param-value> </context-param> <!--使用监听加载log4j的配置文件--> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
<param-value>classpath:config/log4j.properties</param-value> 是加载 log4j.properties 配置文件,要写全该配置文件所在路径
项目运行后看到截图所示,则开启成功
三、建立数据库 ,建表
create database mybatis; use mybatis; create table users( id int primary key auto_increment, username varchar(20), password varchar(20), birthday date )
四、编码
1、bean
User.java
package com.wwx.bean; import java.util.Date; public class User { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } private String username; private String password; private String sex; private Date birthday; @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + ", sex=" + sex + ", birthday=" + birthday + "]"; } }
2、mapper
2.1 UserMapper.java只写接口,不写具体方法实现,实现由mybatis完成,但是有两个条件
1、UserMApper.xml中的namespace要和UserMapper.java的路径相同,两个文件还需在同一目录下

2、UserMapeer.java 中的方法名要与 UseerMapper.xml中的select标签的ID相同,参数类型、数量也必须相同


UserMapper.java
package com.wwx.mapper; import com.wwx.bean.User; public interface UserMapper { public User queryUserByLoginUser(User user); }
UserMapper.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"> <!-- 这个文件中编写sql语句 --> <!-- xml 可以作为配置文件。 --> <mapper namespace="com.wwx.mapper.UserMapper"> <!-- 要在mapper标签内部编写sql --> <!-- 在select 标签内部 编写sql语句 --> <!-- resultType 表示将结果集封装成什么对象。写类的全路径 --> <select id="queryUserByLoginUser" parameterType="com.wwx.bean.User" resultType="com.wwx.bean.User"> select * from users where username=#{username} and password=#{password} </select> </mapper>
3、service
IUserService.java
package com.wwx.service; import com.wwx.bean.User; public interface IUserService { public User queryUserByLoginUser(User user); }
UserServicesImpl.java
package com.wwx.service; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.wwx.bean.User; import com.wwx.mapper.UserMapper; /** * * @author ������ * */ @Service @Transactional public class UserServiceImpl implements IUserService { @Resource private UserMapper userMapper; @Override public User queryUserByLoginUser(User user) { return userMapper.queryUserByLoginUser(user); } }
4、controller
UserController.java
package com.wwx.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.wwx.bean.User; import com.wwx.service.IUserService; @Controller @RequestMapping("/user") public class UserController { @Autowired private IUserService iUserService; User users = new User(); @RequestMapping("/userLogin") public ModelAndView UserLogin(HttpServletRequest httpServletRequest,User user){ users=iUserService.queryUserByLoginUser(user); ModelAndView modelAndView = new ModelAndView(); if (users==null) { modelAndView.setViewName("loginfail"); String url = "index.jsp"; modelAndView.addObject("url", url); System.out.println("登录失败"); return modelAndView; } else { modelAndView.addObject("users",users); System.out.println(users); modelAndView.setViewName("loginsuccess"); System.out.println("登录成功"); return modelAndView; } } }
5、jsp
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="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> <base href="<%=basePath%>"> <title>登录页</title> <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"> --> </head> <body style="text-align: center;"> <h1>欢迎来到大表锅测试主页</h1> <form action="${pageContext.request.contextPath }/user/userLogin.action" method="get"> <h1> 用户名:<input name="username" type="text"> </h1> <h1> 密 码:<input name="password" type="password"> </h1> <button type="reset"><h3>清空</h3></button> <button type="submit" style="margin-left: 100"><h3>登录</h3></button> </form> </body> </html>
loginfail.jsp
<%@ page language="java" import="java.util.*" pageEncoding="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> <base href="<%=basePath%>"> <title>登录失败</title> <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"> --> </head> <body> <h1>用户名或者密码错误,登录失败!</h1> ${url } <h4><a href="${url }">点击跳转到登录页</a></h4> </body> </html>
loinsuccess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="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> <base href="<%=basePath%>"> <title>登录成功</title> <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"> --> </head> <body style="text-align: center; "> <h1>${user.username}登录成功,恭喜你代码没有Bug</h1> </body> </html>
五、项目部署在Tomcat

六、运行成功截图



GitHub 项目源代码下载:https://github.com/Wuwenxin1024/SSM-.git

一、需求
浙公网安备 33010602011771号