ssm框架搭建在ie浏览器上添加数据为什么会添加两条,还会弹出两个alert 提示

[手把手教程][JavaWeb]优雅的SSM应用(三) - 简书
[手把手教程][JavaWeb]优雅的SSM应用(三)
[手把手教程][JavaWeb]优雅的SSM应用(三)
文章正式改名为:[手把手教程][JavaWeb]优雅的SSM应用
这几天一直在踩坑,为什么这么说呢,主要是一直自己没找到优雅的方式来实现一些东西。
虽然说前面也做了一些功能模块,但是总感觉不对劲,毕竟也是刚转做后端。
为了方便手机端用户,尽量使用简单的markdown语法和简单的页面结构。
后面朋友给了我一些他们公司同事写的demo,虽然说不上是牛逼的作品,但是确实符合我现在的需要。毕竟人家的实现方式也是经过实战项目演练出来的。
再次安利一波,博客地址:
IDE为idea15
JDK环境为1.8
maven版本为maven3
Mysql版本为5.5.27
Tomcat版本为7.0.52
流程图绘制(xmind)
仓库管理系统的登录注册模块实现
其他一些开发细节的体现
功能模块分层设计的具体实现
我这姑且算是文章吧,文章都是先用有道云笔记写的,然后在简书上面查看有没有冲突,最后再放到稀土掘金上面
但是稀土掘金上面文章出问题了,反馈上去也没能解决,本来想抓包看看他们的数据的,后面还是没做
···其他想说的就太多了,但都是不是今天的主题。
首先,我们webapp要实现用户登录,必须得能新建用户。所以,我们先把注册用户放在前面。
预期功能:
打开注册页面
填写注册信息
显示注册后的提示信息
有了功能后,我们就能大概明白我们是想要一个什么样子的注册模块了。
一个web注册页面
web页面能进行基本的数据效验
服务器能存储用户的注册信息
注册动作完成后,返回提示页面。
一般的,我们在开发中,有了大概样子的功能模块,我们需要整理一下业务流程和程序执行流程(在企业开发中,有项目经理的话,一般这些都是他们整理出来的,我们只需要开发实现就行。)经过一番挠头,大概的流程图如下所示:
ssm应用三-注册流程
上图说明:
我们在web页面完成注册信息的填写后,我们需要在web页面做一些基本的数据效验。当然后面我们会演示。
注册信息通过基本的验证后,我们直接提交到服务器,tomact → servelt → spring 。我们的后端程序,一切都被spring接管了,所以,我们需要在spring中完成这些功能。
spring和外界通信,我们都是在Controller中完成。所以我们在Controller中处理数据。
当数据通过了Controller中的校验后,我们需要在Controller中来查找数据库是否存在同样的用户名,通用的数据操作流程如:Controller → Service → Dao。
前面我们提到过,Service是为我们的程序提供服务的,我们尽量每个Service对应一个Dao,这样我们只需要提供单一的数据驱动,在外层进行业务组装,这样就能达到我们的目的,同样的,我们这样也能将程序,以后的维护也就相对简单了。
好的,我们上面已经把思路想明白了。现在我们接着就开始实战。
生成注册页面的连接。
我们要生成一个连接,经过查找资料,我们知道我们需要创建一个Controller的类。代码如下:
@Controller
@RequestMapping("/mvc")
public class MainController {
* 登陆页面
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String login(){
return "login";
在上面我们使用了@Controller和@RequestMapping("/mvc")注解。
通俗的来说,我们需要在我们前面配置的Controller路径中,建立使用@Controller的注解的类告诉Spring这是一个控制器。
在类上面的 @RequestMapping("/mvc") ,是说明这个类的访问地址是 /mvc 。
在方法上面的 @RequestMapping(value = "/login",method = RequestMethod.GET) ,是说明我这个方法的访问地址是 /mvc/login ,请求方式是http请求的get方式。
这里我的方法是String方法,则是直接返回一个web页面的名字。
当然,我们并不需要说直接去设定某个jsp文件。我们需要的是在这里指定好名称,然后使用对应的自动完成就能创建出那个jsp文件。
然后我们直接在jsp文件中填写对应的代码就行了。
好的,基本的东西我们都说了,那么我们先去百度找一个登录界面(一定要能看,不能那啥太直接的粗糙的东西,毕竟我们都是有品位的人)。如下图:
ssm应用三-登录注册页面
上面的图中样子还不错的样子,同时他们还是同一个页面,这下就很nice了,又可以少写一个界面了。
按照前面两期我们的东西综合起来,我们需要先把CSS、JS、图片等东西,扔到我们的静态目录中。如下图所示:
ssm应用三-登录注册静态资源
接着我们把登录的html的页面的东西,全部放到login.jsp中。如下:
&%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %&
&%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&
&%-- 上面这两行是java代码的引用 --%&
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&
&script type="text/javascript" src="/static/js/jquery-3.1.1.min.js"&&/script&
&title&仓库管理系统→登录&/title&
&meta http-equiv="Content-Type" content="text/ charset=utf-8"&
&script type="text/javascript" src="/static/js/login.js"&&/script&
&link href="/static/css/login2.css" rel="stylesheet" type="text/css"/&
&h1&仓库管理系统登陆注册&sup&2016&/sup&&/h1&
&div class="login" style="margin-top:50"&
&div class="header"&
&div class="switch" id="switch"&&a class="switch_btn_focus" id="switch_qlogin" href="javascript:void(0);"
tabindex="7"&快速登录&/a&
&a class="switch_btn" id="switch_login" href="javascript:void(0);" tabindex="8"&快速注册&/a&
&div class="switch_bottom" id="switch_bottom" style="position: width: 64 left: 0"&&/div&
&div class="web_qr_login" id="web_qr_login" style="display: height: 235"&
&!--登录--&
&div class="web_login" id="web_login"&
&div class="login-box"&
&div class="login_form"&
&form action="&%=request.getContextPath()%&/userAction/login" name="loginform"
accept-charset="utf-8" id="login_form" class="loginForm"
method="post"&&input type="hidden" name="did" value="0"/&
&input type="hidden" name="to" value="log"/&
&div class="uinArea" id="uinArea"&
&label class="input-tips" for="u"&帐号:&/label&
&div class="inputOuter" id="uArea"&
&input type="text" id="u" name="loginId" class="inputstyle"/&
&div class="pwdArea" id="pwdArea"&
&label class="input-tips" for="p"&密码:&/label&
&div class="inputOuter" id="pArea"&
&input type="password" id="p" name="pwd" class="inputstyle"/&
&div style="padding-left:50margin-top:20"&
&input type="submit" value="登 录"
style="width:150"
class="button_blue"/&&/div&
&!--登录end--&
&!--注册--&
&div class="qlogin" id="qlogin" style="display: "&
&div class="web_login"&
&form name="form2" id="regUser" accept-charset="utf-8" action="&%=request.getContextPath()%&/userAction/reg"
method="post"&
&input type="hidden" name="to" value="reg"/&
&input type="hidden" name="did" value="0"/&
&ul class="reg_form" id="reg-ul"&
&div id="userCue" class="cue"&快速注册请注意格式&/div&
&label for="user" class="input-tips2"&用户名:&/label&
&div class="inputOuter2"&
&input type="text" id="user" name="loginId" maxlength="16" class="inputstyle2"/&
&label for="user" class="input-tips2"&姓名:&/label&
&div class="inputOuter2"&
&input type="text" id="name" name="name" maxlength="16" class="inputstyle2"/&
&label for="passwd" class="input-tips2"&密码:&/label&
&div class="inputOuter2"&
&input type="password" id="passwd" name="pwd" maxlength="16" class="inputstyle2"/&
&label for="passwd2" class="input-tips2"&确认密码:&/label&
&div class="inputOuter2"&
&input type="password" id="passwd2" name="" maxlength="16" class="inputstyle2"/&
&label for="cellNumber" class="input-tips2"&手机号:&/label&
&div class="inputOuter2"&
&input type="text" id="cellNumber" name="cellNumber" maxlength="18" class="inputstyle2"/&
&label for="sex" class="input-tips2"&性别:&/label&
&div class="inputOuter2"&
&input type="text" id="sex" name="sex" maxlength="18" class="inputstyle2"/&
&label for="age" class="input-tips2"&年龄:&/label&
&div class="inputOuter2"&
&input type="age" id="age" name="age" maxlength="18" class="inputstyle2"/&
&div class="inputArea"&
&input type="button" id="reg" style="margin-top:10margin-left:85" class="button_blue"
value="同意协议并注册"/& &a href="#" class="zcxy" target="_blank"&注册协议&/a&
&div class="cl"&&/div&
&!--注册end--&
&div class="jianyi"&*推荐使用ie8或以上版本ie浏览器或Chrome内核浏览器访问本站&/div&
上面的网页代码中的东西,我们也可以不求甚解,只要会调用就行。调用地址是在我们的form表单的action那里填写我们的服务器地址。这里我们甚至可以做前后端分离,用纯粹的html+js来调用Api接口实现前后端分离。
action="&%=request.getContextPath()%&/userAction/reg" method="post"
&%=request.getContextPath()%& 这是指向我们应用的根路径
mothod是说明我们请求的方式,我们这里才用了post,至于其他的方法就不一一介绍了,详细信息请百度查找“ http请求 ”
form表单中,每个input的name我们需要和后端的接口那边的字段对应。
当我们的字段对应后,spring可以自动把请求的内容转换为适应的对象。
小提示:我们可以直接debug我们的程序,只要取消断点程序就可以顺序执行,加入断点只要程序流转到那里,他就会自动调试。
当然,我们的jsp写完后,我们需要给我们的表单请求那里指定请求路径。由于上面我已经指定了路径,所以我们需要在对应的路径创建请求的接口(实际开发中都是先写好请求接口,再让程序调用。由于我这里是提前写好的,所以这里我们得照着路径写代码)。
我们在Controller目录下创建一个UserController类,代码内容如下:
package cn.acheng1314.mvc.
import cn.acheng1314.domain.ResponseO
import cn.acheng1314.domain.U
import cn.acheng1314.exception.*;
import cn.acheng1314.service.serviceImpl.UserServiceI
import cn.acheng1314.utils.GsonU
import cn.acheng1314.utils.StringU
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.C
import org.springframework.ui.ModelM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.ResponseB
import org.springframework.web.servlet.ModelAndV
import javax.servlet.http.HttpServletR
* 用户请求相关控制器
* &br/&Created by acheng on .
@Controller
@RequestMapping("/userAction")
public class UserController {
@Autowired
private UserServiceImpl userS
//自动载入Service对象
private ResponseObj responseO
//bean对象
* 为什么返回值是一个ModelAndView,ModelAndView代表一个web页面&br/&
* setViewName是设置一个jsp页面的名称
* @param req
* @param user
发起请求后,spring接收到请求,然后封装的bean数据
返回一个web页面
* @throws Exception
@RequestMapping(value = "/reg", method = RequestMethod.POST)
public ModelAndView reg(HttpServletRequest req, User user) throws Exception {
ModelAndView mav = new ModelAndView();
//创建一个jsp页面对象
mav.setViewName("home");
//设置JSP文件名
if (null == user) {
mav.addObject("message", "用户信息不能为空!");
//加入提示信息,在jsp中我们直接使用${对象名称}就能获取对应的内容
//返回页面
if (StringUtils.isEmpty(user.getName()) || StringUtils.isEmpty(user.getPwd())) {
mav.addObject("message", "用户名或密码不能为空!");
if (null != userService.findUser(user)) {
mav.addObject("message", "用户已经存在!");
userService.add(user);
} catch (Exception e) {
e.printStackTrace();
mav.addObject("message", "错误:用户其他信息错误");
mav.addObject("code", 110);
mav.addObject("message", "恭喜。注册成功");
req.getSession().setAttribute("user", user);
* 登录接口
* @param req
* @param user
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = {
"application/ charset=utf-8"})
@ResponseBody
public ModelAndView login(HttpServletRequest req, User user) {
ModelAndView mav = new ModelAndView("home");
if (null == user) {
responseObj = new ResponseObj&User&();
responseObj.setCode(ResponseObj.EMPUTY);
responseObj.setMsg("登录信息不能为空");
result = GsonUtils.gson.toJson(responseObj);
//转换的json数据
mav.addObject("result", result);
//返回页面
if (StringUtils.isEmpty(user.getLoginId()) || StringUtils.isEmpty(user.getPwd())) {
responseObj = new ResponseObj&User&();
responseObj.setCode(ResponseObj.FAILED);
responseObj.setMsg("用户名或密码不能为空");
result = GsonUtils.gson.toJson(responseObj);
mav.addObject("result", result);
//查找用户
User user1 = userService.findUser(user);
if (null == user1) {
responseObj = new ResponseObj&User&();
responseObj.setCode(ResponseObj.EMPUTY);
responseObj.setMsg("未找到该用户");
result = GsonUtils.gson.toJson(responseObj);
if (user.getPwd().equals(user1.getPwd())) {
responseObj = new ResponseObj&User&();
responseObj.setCode(ResponseObj.OK);
responseObj.setMsg(ResponseObj.OK_STR);
result = GsonUtils.gson.toJson(responseObj);
responseObj = new ResponseObj&User&();
responseObj.setCode(ResponseObj.FAILED);
responseObj.setMsg("用户密码错误");
result = GsonUtils.gson.toJson(responseObj);
mav.addObject("result", result);
当然很多数据效验我们不能只在后端做,我们需要将数据检查的粒度细化。
不但要在后端做,而且我们的前端页面也要做的,比如说手机号、邮箱帐号、用户名规则等等,用的最多的也就是web页面上面拿到数据用js来判断,使用来判断是否符合标准。
具体的js我也就不写了,因为我也不是很了解JS,只能对着别人写的自己来做修改==
蘑菇头-好伤心
好的,我们现在已经把东西都弄完了,debug开启程序,然后加入断点调试。运行结果如下:
ssm应用三-注册页面和调试
这样我们现在能拿到对应的数据,并且在Controller中加入了数据校验。同时,我们的web页面中也加入了js验证。
现在我们的注册页面也可以了,功能也有了。既然如此,我们应该接着把登录页面做成功,但是我们已经有了这个的思路,那么剩下的只需要依样画瓢就能完成。
具体的东西,都已经在后面的代码中贴出来了。详情请看github:
项目地址:
注册登录完成
简单的前端验证(在代码包中可以看到)
form表单提交
功能模块分析
流程图(使用xmind制作)
下期预告:完整的后台主页,前端使用json数据,列表数据分页。
我创建了全栈交流的企鹅群,有兴趣的来看一看。【行走的java全栈】,群号码:
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details带目录浏览地址:http://www.maoyupeng.com/sprin...
[手把手教程][JavaWeb]SSM框架验证、修复和实例 手把手验证上期的SSM项目:优雅的SpringMvc+Mybatis整合之路框架。 说实话,这一期也应该算是上一期的,但是这起需要单独拿出来的原因有几个,最重要的是我个人讨厌长篇大论。(最简单的就是直接丢项目) 但...
优雅的SpringMvc+Mybatis应用(四) 转眼间文章已经到了第四期了。坚持做一件事,确实是很难的。特别是要不断的转换思维,一个习惯前端开发的人,做什么还是前端的考虑的多一点,后端的架构设计之类的,现在还谈不上,一切稳稳的前进就行了。 关于上一期,本来是投了首页的,...
[手把手教程][JavaWeb]优雅的SpringMvc+Mybatis应用(八) 项目github地址:https://github.com/pc/SpringMvcMybatis 我的简书首页是:http://www.jianshu.com/users...
日下午,淮滨高中国教中心召开信阳市第四次大考质量分析会。本次会议由廖校长主持,国教中心全体教师参会,校党委书记、校长李明、校党委副书记、副校长贾况出席本次会议、并对国教中心工作提出了指导性意见。
会议首先由国教中心教务主任陈卉对本次大考成绩从总...
今日的晨读,让我莫名的想起了备战中考和高考的前三个月。
那个阶段把排队的文化发挥到光芒万丈。
黑板上的右上角写着距离高考还有多少天,距离模拟考试还有多少天?你非常清楚的知道月考的排名是多少名。期中考试的排名又是多少。期末考试的排名又是多少名。年级多少名,全市又排...
兔子小姐是家里的老幺,她还有两个姐姐,长得最漂亮的大姐嫁给了老虎,最贤惠的二姐嫁给了大熊先生。兔子小姐觉得老虎不会一直对大姐好,因为老虎拥有整片森林,他身后还有很多选择。而大熊先生虽然忠厚老实但没有情趣,他们在往后的日子里可能会渐行渐远。 兔子小姐说:“我要找到这个世界上最...
Java在设计时就对关键考虑因素进行了总结: 简单性 安全性 可移植性 面向对象 健壮性 多线程 体系结构中立 解释执行 高性能 分布式 动态性 安全性和可移植性在上篇中已经介绍了,下面介绍其他的特性 简单性: 如果有一定经验的哪怕就会C的也会很容易掌握Java,再说大一下...
一 春夏秋冬几尺台,清风两袖染鬓白。 剩除加减人生事,不负青春不负才。
二 菊香九月佳节临,化雨春风解混沌。 三尺讲台路不尽,十年树木报人民。首先,该项目的结构图,如下。
一、导入jar包,并设置java包中的查找内容,包括.xml 文件。
&dependencies&
&!--测试包 --&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&4.12&/version&
&scope&test&/scope&
&/dependency&
&!--引入PageHelper插件--&
&dependency&
&groupId&com.github.pagehelper&/groupId&
&artifactId&pagehelper&/artifactId&
&version&5.1.4&/version&
&/dependency&
&!-- https://mvnrepository.com/artifact/org.springframework/spring-core --&
&!--介入aspectj的相关包 --&
&dependency&
&groupId&org.aspectj&/groupId&
&artifactId&aspectjweaver&/artifactId&
&version&1.8.11&/version&
&/dependency&
&!--Spring + springMVC
&!--spring的相关包 --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-jdbc&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-aop&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-beans&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context-support&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-expression&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-orm&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-tx&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-aspects&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-oxm&/artifactId&
&version&4.2.5.RELEASE&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-test&/artifactId&
&version&4.2.5.RELEASE&/version&
&scope&test&/scope&
&/dependency&
&!-- c3p0数据源 --&
&dependency&
&groupId&com.mchange&/groupId&
&artifactId&c3p0&/artifactId&
&version&0.9.5-pre10&/version&
&/dependency&
&!--数据库--&
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.4&/version&
&/dependency&
&!--导入的是日志相关的包 --&
&dependency&
&groupId&commons-logging&/groupId&
&artifactId&commons-logging&/artifactId&
&version&1.2&/version&
&/dependency&
&dependency&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&version&1.2.17&/version&
&/dependency&
&!--带入cglib代理的包 --&
&dependency&
&groupId&cglib&/groupId&
&artifactId&cglib&/artifactId&
&version&3.2.4&/version&
&/dependency&
&!--servlet --&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&javax.servlet-api&/artifactId&
&version&3.1.0&/version&
&scope&provided&/scope&
&/dependency&
&!--导入我们jstl的标签库的包 --&
&dependency&
&groupId&javax.servlet.jsp.jstl&/groupId&
&artifactId&javax.servlet.jsp.jstl-api&/artifactId&
&version&1.2.1&/version&
&/dependency&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&jsp-api&/artifactId&
&version&2.0&/version&
&scope&provided&/scope&
&/dependency&
&dependency&
&groupId&org.apache.taglibs&/groupId&
&artifactId&taglibs-standard-impl&/artifactId&
&version&1.2.5&/version&
&/dependency&
&dependency&
&groupId&xom&/groupId&
&artifactId&xom&/artifactId&
&version&1.2.5&/version&
&/dependency&
&dependency&
&groupId&net.sf.json-lib&/groupId&
&artifactId&json-lib&/artifactId&
&version&2.4&/version&
&classifier&jdk15&/classifier&
&/dependency&
&dependency&
&groupId&org.jdom&/groupId&
&artifactId&jdom&/artifactId&
&version&1.1&/version&
&/dependency&
&!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-core&/artifactId&
&version&2.9.2&/version&
&/dependency&
&!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --&
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-databind&/artifactId&
&version&2.9.2&/version&
&/dependency&
&dependency&
&groupId&commons-fileupload&/groupId&
&artifactId&commons-fileupload&/artifactId&
&version&1.3.1&/version&
&/dependency&
&!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --&
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-core&/artifactId&
&version&1.2.3&/version&
&/dependency&
&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi-ooxml&/artifactId&
&version&3.17&/version&
&/dependency&
&!--Mybatis jar包--&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis&/artifactId&
&version&3.4.6&/version&
&/dependency&
&!--MBG- mybatis 逆向生成--&
&dependency&
&groupId&org.mybatis.generator&/groupId&
&artifactId&mybatis-generator-core&/artifactId&
&version&1.3.6&/version&
&/dependency&
&!--Mybatis 和 Spring--&
&!--An easy-to-use Spring bridge for MyBatis sql mapping framework.--&
&dependency&
&groupId&org.mybatis&/groupId&
&artifactId&mybatis-spring&/artifactId&
&version&1.3.2&/version&
&/dependency&
&/dependencies&
&finalName&SSMBook&/finalName&
&pluginManagement&&!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --&
&artifactId&maven-clean-plugin&/artifactId&
&version&3.0.0&/version&
&!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --&
&artifactId&maven-resources-plugin&/artifactId&
&version&3.0.2&/version&
&artifactId&maven-compiler-plugin&/artifactId&
&version&3.7.0&/version&
&artifactId&maven-surefire-plugin&/artifactId&
&version&2.20.1&/version&
&artifactId&maven-war-plugin&/artifactId&
&version&3.2.0&/version&
&artifactId&maven-install-plugin&/artifactId&
&version&2.5.2&/version&
&artifactId&maven-deploy-plugin&/artifactId&
&version&2.8.2&/version&
&/plugins&
&/pluginManagement&
&resources&
&resource&
&directory&src/main/java&/directory&
&includes&
&include&**/*.xml&/include&
&include&**/*.properties&/include&
&/includes&
&/resource&
&resource&
&directory&src/main/webapp&/directory&
&includes&
&include&**/*.xml&/include&
&include&**/*.properties&/include&
&include&**/*.jsp&/include&
&/includes&
&/resource&
&/resources&
二、mybatis 逆向工程生成 POJO + dao接口 + mapper.xml
接着,新建 generator-config.xml 文件,内容如下:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"&
&generatorConfiguration&
&context id="testTables" targetRuntime="MyBatis3"&
&commentGenerator&
&!-- 是否去除自动生成的注释 true:是 : false:否 --&
&property name="suppressAllComments" value="true" /&
&/commentGenerator&
&!--数据库连接的信息:驱动类、连接地址、用户名、密码 --&
&jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/ssmbook" userId="root"
password="123456"&
&/jdbcConnection&
&!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL
和 NUMERIC 类型解析为java.math.BigDecimal --&
&javaTypeResolver&
&property name="forceBigDecimals" value="false" /&
&/javaTypeResolver&
&!-- targetProject:生成PO类的位置 --&
&javaModelGenerator targetPackage="com.lr.ssmbook.pojo"
targetProject=".\src\main\java"&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name="enableSubPackages" value="false" /&
&!-- 从数据库返回的值被清理前后的空格 --&
&property name="trimStrings" value="true" /&
&/javaModelGenerator&
&!-- targetProject:mapper映射文件生成的位置 --&
&sqlMapGenerator targetPackage="com.lr.ssmbook.mapper"
targetProject=".\src\main\java"&
&!-- enableSubPackages:是否让schema作为包的后缀 --&
&property name="enableSubPackages" value="false" /&
&/sqlMapGenerator&
&!--指定dao接口生成的位置,mapper接口--&
&javaClientGenerator type="XMLMAPPER" targetPackage="com.lr.ssmbook.dao"
targetProject=".\src\main\java"&
&property name="enableSubPackages" value="true" /&
&/javaClientGenerator&
&!-- 指定数据库表 --&
&table tableName="tb_user1" domainObjectName="User"
enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"/&
&table tableName="tb_book1" domainObjectName="Book"
enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false"/&
&/context&
&/generatorConfiguration&
接着,新建一个MGBTest类,逆向工程生成 POJO + dao + mapper.xml
public class MGBTest {
public static void main(String[] args) throws Exception{
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
List&String& warnings = new ArrayList&String&();
boolean overwrite =
File configFile = new File("src/main/webapp/config/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
生成之后的POJO是:Book.class, User.class
public class Book implements Serializable{
private I //id
private S//书名
private S//作者
private D//发行日期
private S//出版社
private D//价格
private S//封面图片
private S//描述
//getter setter 方法
public class User implements Serializable{
private I//id
private S//登录名
private S//密码
private S//用户名
private S//电话
private S//地址
//getter setter 方法
三、db.properties, log4j.properties 配置信息
db.properties :
#mysqldatabasesetting
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmbook?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456
jdbc.initialPoolSize=5
jdbc.maxPoolSize=20
jdbc.maxIdleTime=1000
jdbc.minPoolSize=6
log4j.properties:
log4j.rootLogger=INFO,console,file
#-----------------------------------#
#1 定义日志输出目的地为控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ###
#%c: 输出日志信息所属的类目,通常就是所在类的全名
#%m: 输出代码中指定的消息,产生的日志具体信息
#%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE}%5p %c{1}:%L-%m%n
log4j.logger.org.quartz=INFO
log4j.appender.file = org.apache.log4j.RollingFileAppender
#日志文件输出目录
log4j.appender.file.File=src/logs/mylogs.log
#定义文件最大大小
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.DatePattern=yyyy-MM-dd'.log'
log4j.appender.file.Threshold=INFO
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-ddHH\:mm\:ss}[%c][%t\:%r]-[%p]%m%n
四、applicationContext.xml 配置文件
applicationContext.xml 该配置文件,需要整合 mybatis 和 自动注入。
&?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: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.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"&
&!--Spring 的配置文件,主要配置和业务逻辑有关的--&
&context:component-scan base-package="com.lr.ssmbook"&
&!--扫描所有的除了控制器--&
&context:exclude-filter
type="annotation" expression="org.springframework.stereotype.Controller"/&
&/context:component-scan&
&!--===================数据源,事务控制=====================================--&
&context:property-placeholder location="classpath:db.properties"/&
&bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&
&property name="jdbcUrl" value="${jdbc.url}"/&
&property name="driverClass" value="${jdbc.driver}"/&
&property name="user" value="${jdbc.user}"/&
&property name="password" value="${jdbc.password}"/&
&!-- 初始化连接大小 --&
&property name="initialPoolSize" value="${jdbc.initialPoolSize}"&&/property&
&!-- 连接池最大数量 --&
&property name="maxPoolSize" value="${jdbc.maxPoolSize}"/&
&!-- 连接池最大空闲 --&
&property name="maxIdleTime" value="${jdbc.maxIdleTime}"/&
&!-- 连接池最小数量 --&
&property name="minPoolSize" value="${jdbc.minPoolSize}"/&
&!--=========================================================================--&
&!--========================配置和 Mybatis 整合===============================--&
&bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
&!-- 注入数据库连接池 --&
&property name="dataSource" ref="dataSource"/&
&!--指定mybatis全局配置文件--&
&property name="configLocation"
value="classpath:mybatis/mybatis-config.xml"/&
&!--指定mybatis ,mapper 文件的位置--&
&property name="mapperLocations" value="classpath:com/lr/ssmbook/mapper/BookMapper.xml"/&
&!--配置扫描器,将mybatis 接口的实现加入到ioc容器中--&
&bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"&
&!-- 注入sqlSessionFactory --&
&property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/&
&!--扫描所有dao接口的实现,加入的ioc容器--&
&property name="basePackage" value="com.lr.ssmbook.dao"/&
&!--配置一个可以执行批量的sqlSession--&
&bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"&
&constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/&
&constructor-arg name="executorType" value="BATCH"/&
&!--=======================================================================--&
&!--==============================事务控制的配置===========================--&
&bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
&!--控制数据源--&
&property name="dataSource" ref="dataSource"/&
&!--配置基于注解的声明式事务--&
&tx:annotation-driven transaction-manager="transactionManager" /&
&!--========================================================================--&
五、springmvc-config.xml 配置文件
springmvc-config.xml 配置文件,主要是设置controller层的扫描、返回的格式等
&?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"&
&!-- 启动mvc注解 设置默认的配置--&
&mvc:annotation-driven /&
&!-- 扫描controller --&
&context:component-scan base-package="com.lr.ssmbook.controller"/&
&!-- 不拦截静态资源 --&
&!--&mvc:resources location="/WEB-INF/jsp/" mapping="/jsp/**"&&/mvc:resources&--&
&!-- 避免IE执行AJAX时,返回JSON出现下载文件 --&
&bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&
&property name="supportedMediaTypes"&
&value&text/charset=UTF-8&/value&
&/property&
&!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --&
&bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&property name="messageConverters"&
&ref bean="mappingJacksonHttpMessageConverter" /& &!-- JSON转换器 --&
&/property&
&!-- 定义跳转的文件的前后缀 ,视图模式配置,视图解析器--&
&bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&!--这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址--&
&property name="prefix" value="/jsp" /&
&property name="suffix" value=".jsp" /&
&!-- 配置annotation 类型的处理映射器--&
&bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"&&/bean&
&!--配置annotation 类型的处理器适配器--&
&bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&&/bean&
&!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --&
&bean id="multipartResolver"
name="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"&
&!-- 默认编码 --&
&property name="defaultEncoding" value="utf-8" /&
&!-- 文件大小最大值 --&
&property name="maxUploadSize" value="" /&
&!-- 内存中的最大值 --&
&property name="maxInMemorySize" value="40960" /&
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&
&property name="messageConverters"&
&ref bean="mappingJackson2HttpMessageConverter" /&
&/property&
&bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"&
&property name="supportedMediaTypes"&
&value&text/charset=UTF-8&/value&
&value&text/charset=UTF-8&/value&
&value&application/charset=UTF-8&/value&
&/property&
六、web.xml 配置文件
该web.xml 配置文件,主要是加载application.xml 和 springmvc-config.xml 配置文件并且监听logger日志等。
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN "
"http://java.sun.com/dtd/web-app_2_3.dtd" &
&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"
version="3.0"&
&display-name&SSMBook&/display-name&
&!-- 响应编码:过滤器 --&
&filter-name&encodingFilter&/filter-name&
&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&
&async-supported&true&/async-supported&
&init-param&
&param-name&encoding&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&encodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&listener&
&listener-class&org.springframework.web.util.Log4jConfigListener&/listener-class&
&/listener&
&!-- log4j日志输出 --&
&context-param&
&param-name&log4jConfigLocation&/param-name&
&param-value&classpath:log4j.properties&/param-value&
&/context-param&
&!--contextConfigLocation 参数用来指定 Spring 的配置文件--&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:config/applicationContext.xml&/param-value&
&/context-param&
&!--配置 Spring 的核心监听器--&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&!--定义 Spring Mvc 的前端控制器--&
&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/springmvc-config.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&async-supported&true&/async-supported&
&/servlet&
&servlet-mapping&
&servlet-name&springmvc&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
七、dao 层
UserDao层接口:UserMapper,其中使用的方法通过注释来执行 sql 语句
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
* 根据登录名和密码查询用户
*@Param: String loginname
* @Param: String password
* @Return 找到返回对象,没有找到返回null
@Select("SELECT * FROM tb_user WHERE loginname = #{loginname} AND password = #{password}")
User findWithLoginAndPsd(@Param("loginname")String loginname, @Param("password") String password);
BookDao层接口:BookMapper
public interface BookMapper {
int deleteByPrimaryKey(Integer id);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
* 查询所有图书
* @Return 图书对象集合
@Select("SELECT * FROM tb_book")
List&Book& findAll();
public Book findOne(Integer id, String name);
八、service 层
UserService接口:
public interface UserService {
* 判断用户登陆
* param String loginname
* return 找到返回的 User 对象,没有找到返回 null
User login(String loginname, String password);
UserServiceImpl实现类:
@Transactional
public class UserServiceImpl implements UserService{
//自动注入 UserMapper
@Autowired
private UserMapper userM
* UserService 接口 login 方法实现
public User login(String loginname, String password) {
return userMapper.findWithLoginAndPsd(loginname, password);
BookService接口:
public interface BookService {
*查找所有图书
List&Book& getAll();
BookServiceImpl实现类:
@Transactional
public class BookServiceImpl implements BookService{
@Autowired
private BookMapper bookM
public List&Book& getAll() {
return bookMapper.findAll();
九、controller 层
UserController:
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userS
//处理 login 请求
@RequestMapping("/login")
public ModelAndView login(String loginname, String password, HttpSession session){
ModelAndView mav = new ModelAndView();
User user = userService.login(loginname, password);
if (user != null){
session.setAttribute("user", user);
mav.setView(new RedirectView("/books/main"));
mav.addObject("message", "登录名或密码错误");
mav.setViewName("/login");
BookController:
@Controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookS
@RequestMapping("/main")
public String main(Model model){
List&Book& book_list = bookService.getAll();
//将图书集合添加到 model 中
model.addAttribute("book_list", book_list);
return "/main";
十、login.jsp 和 main.jsp
login.jsp:
&%@ page contentType="text/charset=UTF-8" %&
&title&登陆&/title&
&form action="/users/login"&
&h4 style="color:"&${requestScope.message}&/h4&
&td&&label&登录名:&/label&&/td&
&td&&input type="text" name="loginname" id="loginname"/&&/td&
&td&&label&密码&/label&&/td&
&td&&input type="password" name="password" id="password"/&&/td&
&td&&input type="submit" value="登陆"/&&/td&
&%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&
&%@ page contentType="text/charset=UTF-8" %&
&%@ page isELIgnored="false" %&
&% String basePath = request.getScheme() + "://" + request.getServerName() +
":" + request.getServerPort() + request.getContextPath() + "/";%&
&base href="&%=basePath%&"&
&title&首页&/title&
&style type="text/css"&
border-collapse:
border-spacing: 0
border-left: 1px solid #888888;
border-right: 1px solid #888888;
border-bottom: 1px solid #888888;
padding: 5px 15
font-weight:
background: #
欢迎[${sessionScope.user.username}]访问
&th&封面&/th&&th&书名&/th&&th&作者&/th&&th&价格&/th&
&c:forEach items="${requestScope.book_list}" var="book"&
&td&&img src="images/${book.image}" height="60"&&/td&
&td&${book.name}&/td&
&td&${book.author}&/td&
&td&${book.price}&/td&
&/c:forEach&
十一、运行结果
由于数据库中,图片没给地址,所以显示为404,不过这都无伤大雅,哈哈。
本篇文章主要内容是介绍如何使用IntelliJ IDEA创建Spring + SpringMVC + MyBatis项目,下面会给出项目搭建的详细步骤以及相关的配置文件。...
了解框架:
1:Spring 是一个轻量级的Java开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应...
apache-tomcat 7
apache-maven(后面详细讲!这东西我一开始也很懵逼)
mysql 5以上的版本
navicat(有了这个就不用cmd了,可以直接显示数据库,如下图,...
关于目前比较流行的框架,前面的文章都有进行了相关内容的介绍,所以在这里的话主要就是介绍一下关于SSM,即Spring,springMVC和Mybatis的整合知识点。
一:整合Spring+Sprin...
转载至:http://blog.csdn.net/qq/article/details/
这是我系列总结的最后一篇, 终于弄完了!
虽然有点累, 但是很充实, 很开心, 送一张图片给自己, 哈哈!
Github地址
https://github.com/menglanying...
ssm框架整合(无maven)一、ssm介绍
对于比较小的项目,建议使用ssm框架,轻量级,速度快,效率高。
1.1 spring MVC + spring +mybatis,是标准的MVC设计...
【学习背景】
最近学习的项目是SSM框架,即Spring、SpringMVC和Mybatis。之前实习的项目底层用的就是mybatis,但那
时为了保证团队开发进度,只顾着开发,并且项目框架、所用到...
自从进入一家游戏公司以后,就抛弃了eclipse转战于idea,刚开始一直很不习惯,但是用了一周以后,在打开eclipse的时候,有一种想卸载掉的冲动,好吧,我是觉得idea比eclipse好用,关于...
没有更多推荐了,

我要回帖

更多关于 ssm框架 的文章

 

随机推荐