开发环境:jdk1.7 spring boot1.5.2 mybatis3.2.8 mysql5.6
uml类图如下所示:
pom配置
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wx</groupId>
<artifactId>SMMvcBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- jsp支持,因为spring boot默认不支持jsp -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- jstl标签库 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 阿里巴巴json解析包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.15</version>
</dependency>
<!-- 阿里巴巴druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 添加Spring boot的插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
sql脚本
/*
SQLyog Community v11.01 (32 bit)
MySQL - 5.5.23 : Database - schooldb
*********************************************************************
*/
CREATE DATABASE if not exists schooldb DEFAULT CHARACTER SET utf8;
USE schooldb;
DROP TABLE IF EXISTS account;
/*简单模拟银行转帐的帐户表*/
CREATE TABLE account
(
userId INT PRIMARY KEY,
userName VARCHAR(20) NOT NULL,
balance FLOAT
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS department;
/*大学里的系表*/
CREATE TABLE department
(
deptId SMALLINT PRIMARY KEY,
departName VARCHAR(20) NOT NULL,
address VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS student;
/*学生表*/
CREATE TABLE student
(
stuId INT PRIMARY KEY AUTO_INCREMENT,
stuName VARCHAR(20) NOT NULL,
gender VARCHAR(2),
age SMALLINT,
address VARCHAR(200) DEFAULT '学生宿舍',
deptIdd SMALLINT,
FOREIGN KEY(deptIdd) REFERENCES department(deptId)
)AUTO_INCREMENT=100 ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS user;
/*用户表*/
CREATE TABLE USER
(
userId INT PRIMARY KEY AUTO_INCREMENT,
userName VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(20) NOT NULL,
email VARCHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*插入测试数据*/
INSERT INTO account VALUES(100,'麻子',2000);
INSERT INTO account VALUES(101,'小丽',2000);
--
INSERT INTO USER(userName,PASSWORD,email) VALUES('jack','123','jack@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('mike','123','mike@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('麻子','123','mazi@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('张三','123','zhangsna@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('xiaoli','123','xiaoli@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('songshu','123','songshu@qq.com');
INSERT INTO USER(userName,PASSWORD,email) VALUES('ggg','123','ggg@qq.com');
--
INSERT INTO department VALUES (10,'计算机系','计算机楼302');
INSERT INTO department VALUES (11,'艺术系','艺术楼211');
INSERT INTO department VALUES (12,'经管系','商学院911');
INSERT INTO department VALUES (13,'工程系','工程楼301');
INSERT INTO department VALUES (14,'土木系','建筑楼355');
--
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王燕','女',18,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张栋','男',21,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('李波','男',21,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('陈建','男',19,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('王江洪','男',25,DEFAULT,12);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('潘将','男',24,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','男',22,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张斌','女',20,DEFAULT,10);
--
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘大海','男',28,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘德华','男',31,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周润发','男',41,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('张学友','男',37,DEFAULT,11);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周星驰','男',42,DEFAULT,12);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘亦菲','女',24,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('胡歌','男',32,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('范冰冰','女',20,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('杨幂','女',26,DEFAULT,14);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('刘涛','女',27,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('周迅','女',21,DEFAULT,13);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('古力娜扎','女',19,DEFAULT,10);
INSERT INTO Student(stuName,gender,age,address,deptIdd) VALUES ('黑山老妖','妖',99,DEFAULT,12);
全局配置文件application.properties
server.port=8088
server.servlet-path=*.php
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
#调整所有日志级别
logging.level.root=INFO
#调整spring日志级别
#logging.level.org.springframework=INFO
#配置ContextPath
server.context-path=/BOOTSM
#jsp,servlet修改后无需重新发布
server.jsp-servlet.init-parameters.development=true
启动类SmmvcApp
package com.wx.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@SpringBootApplication
public class SmmvcApp {
public static void main(String[] args) {
SpringApplication.run(SmmvcApp.class, args);
}
}
整合mybatis
package com.wx.boot;
import java.io.IOException;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
@Configuration
@AutoConfigureAfter(DataSourceConfig.class)
public class MyBatisConfig {
@Bean
@ConditionalOnMissingBean //当容器里没有指定的Bean的情况下创建该对象
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
// 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
// 设置mybatis的主配置文件
ResourcePatternResolver resolver =
new PathMatchingResourcePatternResolver();
Resource mybatisConfigXml = resolver.getResource("classpath:configs/mybatis-config.xml");
sqlSessionFactoryBean.setConfigLocation(mybatisConfigXml);
//扫描mapper文件
Resource[] resoures = null;
try {
resoures=resolver.getResources("classpath:com/wx/entitys/*.xml");
} catch (IOException e) {
e.printStackTrace();
}
//Resource[] resoures=new Resource[]{mybatisMapperXml};
sqlSessionFactoryBean.setMapperLocations(resoures);
return sqlSessionFactoryBean;
}
@Bean
@ConditionalOnMissingBean
public SqlSessionTemplate sqlTemplate(SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
过滤器
package com.wx.boot;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter(filterName="loginFilter",urlPatterns="/*"
,initParams={@WebInitParam(name="exclusions",
value="BOOTSM/,.js,.gif,.jpg,.jpeg,.png,.css,.ico,Err404.html,Err500.html"
+",Login.jsp,Login.php,Register.jsp,register.php,CheckUser.php,"
+"ShowOneUser.jsp,ShowResult.jsp,Trans.php,ShowOneUser.php,quit.php")
})
public class LoginFilter implements Filter{
private String[] reqUrls;
public void init(FilterConfig filterConfig) throws ServletException {
String urlsStr=filterConfig.getInitParameter("exclusions");
reqUrls=urlsStr.split(",");
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
HttpSession session=request.getSession();
String url=request.getRequestURI();
if(!url.startsWith("/BOOTSM")){
url=url.substring(url.lastIndexOf("/")+1);
}
System.out.println("url==>"+url);
boolean flag=false;
for(int i=0;i<reqUrls.length;i++){
url=url.toLowerCase();
reqUrls[i]=reqUrls[i].toLowerCase();
reqUrls[i]=reqUrls[i].trim();
if(url.endsWith(reqUrls[i])){
System.out.println("约定不拦截的请求直接放行==>"+url);
flag=true;
break;
}
}
if(flag){
chain.doFilter(arg0, arg1);//约定不拦截的请求直接放行
}else{
String userName=(String)session.getAttribute("userStr");
if(userName!=null){
chain.doFilter(arg0, arg1);//已经登录的请求放行
}else{
session.setAttribute("loginFlag", "no");
response.sendRedirect("Login.jsp");
}
}
}
public void destroy() {
System.out.println("过滤器销毁了...");
}
}
配置扫描,配置页码错误处理
package com.wx.boot;
import java.nio.charset.Charset;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.StringHttpMessageConverter;
@Configuration
@AutoConfigureAfter(MyBatisConfig.class)
@ComponentScan(basePackages = "com.wx.dao.*,com.wx.biz,com.wx.controler.*")
//默认扫面当前包,以支持过滤器,监听器,servlet
@ServletComponentScan
public class SpringConfig {
//统一的编码配置,默认是utf-8,不配置也可以
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
return converter;
}
//统一页码处理配置
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/Err404.html");
ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/Err500.html");
container.addErrorPages( error404Page, error500Page);
}
};
}
}
关键代码BaseDaoImpl.java
package com.wx.dao;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 集合持久层的公用的增,删,改,查的父类
* <T> 表示传入实体类
* @author 汪祥
* 2015-09-11
*/
public class BaseDaoImpl<T> implements IBaseDao<T> {
@Autowired
protected SqlSessionTemplate sqlTemplate;
/**
* 获取传过来的泛型类名称
* @return String 泛型类名称的小写形式
*/
@SuppressWarnings("unchecked")
public String getClassName() {
// 在父类中得到子类声明的父类的泛型信息
ParameterizedType pt = (ParameterizedType) this.getClass()
.getGenericSuperclass();
Class<T> clazz = (Class) pt.getActualTypeArguments()[0];
// 这里是获取实体类的简单名称,再把类名转为小写
String className=clazz.getSimpleName().toString().toLowerCase();
System.out.println("className:"+className);
return className;
}
/**
* 添加一条数据
* @param t 实体类的对象
* @return 添加的记录条数
*/
public Integer add(T t) {
return sqlTemplate.insert(this.getClassName() + ".add", t);
}
/**
* 根据id删除记录
* @param id 对象编号
* @return 被删除的记录条数
*/
public Integer deleteById(String id) {
return sqlTemplate.delete(this.getClassName() + ".deleteById", id);
}
/**
* 根据id查询一条记录
* @param id 对象编号
* @return 被修改的记录条数
*/
@SuppressWarnings("unchecked")
public T getById(String id) {
return (T)sqlTemplate.selectOne(this.getClassName() + ".getById", id);
}
/**
* 修改数据
* @param t 实体类的对象
* @return 被修改的记录条数
*/
public Integer modify(T t) {
return sqlTemplate.update(this.getClassName() + ".update", t);
}
/**
* 查询多条记录
* @param t 实体类的对象
* @return 对象列表
*/
public List<T> queryMany(T t) {
return sqlTemplate.selectList(this.getClassName() + ".queryMany", t);
}
}
UserDaoImpl.java
package com.wx.dao.user;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.wx.dao.BaseDaoImpl;
import com.wx.entitys.UserEntity;
@Repository("userDao")
public class UserDaoImpl extends BaseDaoImpl<UserEntity> implements IUserDao {
public boolean isLogin(UserEntity paramUser) {
boolean flag=false;
UserEntity theUser=sqlTemplate.selectOne("userentity.selectForLogin", paramUser);
if(theUser!=null){
flag=true;
}
return flag;
}
public boolean isUserExist(String userName) {
boolean flag=false;
List<UserEntity> userList=sqlTemplate.selectList("userentity.selectByName", userName);
if(userList!=null && userList.size()>=1){
flag=true;
}
return flag;
}
}
关键代码之UserControl
package com.wx.controler.user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.wx.biz.UserBiz;
import com.wx.entitys.UserEntity;
@Controller
public class UserControl{
@Autowired
private UserBiz userBiz;
@RequestMapping(value="/Login.php",method=RequestMethod.POST)
public ModelAndView login(HttpServletRequest request,HttpServletResponse response){
HttpSession session=request.getSession();
session.setMaxInactiveInterval(5*60); //5分钟后session失效
String userName=request.getParameter("userName");
String passWord=request.getParameter("pwd");
UserEntity user=new UserEntity(userName, passWord);
ModelAndView mov=null;
if(userBiz.isLogin(user)){
session.setAttribute("userStr",userName);
mov=new ModelAndView("redirect:QueryStu.php");
}else{
session.setAttribute("msg", "用户名或密码错误");
mov=new ModelAndView("redirect:Login.jsp");
}
return mov;
}
@RequestMapping(value="/Register.php",method=RequestMethod.POST)
public ModelAndView register(HttpServletRequest request,
HttpServletResponse response,UserEntity user){
ModelAndView mov=new ModelAndView("index");
userBiz.save(user);
return mov;
}
@RequestMapping(value="/Quit.php")
public ModelAndView quit(HttpServletRequest request,HttpServletResponse response){
HttpSession session=request.getSession();
session.invalidate();
ModelAndView mov=new ModelAndView("redirect:Login.jsp");
return mov;
}
@RequestMapping(value="/ShowOneUser.php")
public ModelAndView showOne(HttpServletRequest request,HttpServletResponse response){
String userId=request.getParameter("userId");
UserEntity user=userBiz.getById(userId);
request.setAttribute("oneUser", user);
ModelAndView mov=new ModelAndView("ShowOneUser");
return mov;
}
@RequestMapping(value="/CheckUser.php")
public void isUserExist(HttpServletRequest request,
HttpServletResponse response) throws IOException{
String userName=request.getParameter("userName");
PrintWriter out=response.getWriter();
String returnStr="err";
if(!userBiz.isUserExist(userName)){
returnStr="ok";
}
out.println(returnStr);
out.flush();
out.close();
}
}