博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring+springMVC+mybatis的整合 part6
阅读量:6435 次
发布时间:2019-06-23

本文共 6629 字,大约阅读时间需要 22 分钟。

登录注册

首先,我们webapp要实现用户登录,必须得能新建用户。所以先把注册用户放在前面。

预期功能:打开注册页面
填写注册信息
点击注册
显示注册后的提示信息

一个web注册页面

web页面能进行基本的数据效验
服务器能存储用户的注册信息
注册动作完成后,返回提示页面。

一般在开发中,有了大概样子的功能模块,需要整理一下业务流程和程序执行流程

大概的流程图如下所示:

ssm%E5%BA%94%E7%94%A8%E4%B8%89-%E6%B3%A8

上图说明:

web页面完成注册信息的填写后,需要在web页面做一些基本的数据效验。
注册信息通过基本的验证后,直接提交到服务器,tomact → servelt → spring 。后端程序一切都被spring接管了,所以,需要在spring中完成这些功能。
spring和外界通信,我们都是在Controller中完成。所以我们在Controller中处理数据。
当数据通过了Controller中的校验后,需要在Controller中来查找数据库是否存在同样的用户名,通用的数据操作流程如:Controller → Service → Dao
Service是为我们的程序提供服务的,尽量每个Service对应一个Dao,只需要提供单一的数据驱动,在外层进行业务组装,这样就能达到目的,同样也能将程序,以后的维护也就相对简单了。

在实际项目中主要是使用JSON数据,所以要写一个返回json数据的实体

在domain包中新建一个ResponseObj类

public class ResponseObj 
{ public final static int OK = 1, FAILED = 0, EMPUTY = -1; public final static String OK_STR = "成功", FAILED_STR = "失败", EMPUTY_STR = "数据为空"; private int code; // 状态码,0成功;1空数据;-1请求失败 private String msg; private Object data; 省略code,msg,data的set,get方法}

要写登录注册的接口,我们先创建一个mvc目录,目录下controller包

controller包中创建一个MainController的类。

@Controller@RequestMapping("/mvc")public class MainController {    /**     * 登陆页面     * @return     */    @GetMapping("/login")    public String login(){        return "login";    }}

在实际项目中主要是使用JSON数据,所以不使用ModelAndView

JSON数据解析我用的是阿里巴巴的Fastjson
具体使用:
MainController主要是用于跳转到登录页面
我们在Controller目录下创建一个UserController

@Controller@RequestMapping("/userAction")public class UserController {    @Autowired    private UserServiceImpl userService;    //自动载入Service对象    private ResponseObj responseObj;    //返回json数据的实体    /**     * @param req   http请求     * @param user  发起请求后,spring接收到请求,然后封装的bean数据     * @throws Exception     */    @PostMapping("/reg")    @ResponseBody    public Object reg(HttpServletRequest request, User user, HttpSession session) throws Exception {        JSONObject jsonObject=new JSONObject();        responseObj = new ResponseObj
(); if (null == user) { responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("用户信息不能为空!"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } if (StringUtils.isEmpty(user.getLoginId()) || StringUtils.isEmpty(user.getPwd())) { responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("用户名或密码不能为空!"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } if (null != userService.findUser(user)) { responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("用户已经存在!"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } try { userService.add(user); } catch (Exception e) { e.printStackTrace(); responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("其他错误!"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } userService.updateLoginSession(request.getSession().getId(), user.getLoginId()); responseObj.setCode(ResponseObj.OK); responseObj.setMsg("注册成功"); user.setPwd(session.getId()); //单独设置密码为sessionId 误导黑客,前端访问服务器的时候必须有这个信息才能操作 user.setNextUrl(request.getContextPath() + "/mvc/home"); //单独控制地址 responseObj.setData(user); session.setAttribute("userInfo", user); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } /** * 登录接口 * @param req * @param user * @return */ @PostMapping("/login") @ResponseBody public Object login(HttpServletRequest request, User user,HttpSession session) throws Exception{ JSONObject jsonObject=new JSONObject(); responseObj = new ResponseObj
(); if (PublicUtil.isJsonRequest(request)) { //确认是否json提交 user = new GsonUtils().jsonRequest2Bean(request.getInputStream(), User.class); //转换为指定类型的对象 return user.toString(); } if (null == user) { responseObj.setCode(ResponseObj.EMPUTY); responseObj.setMsg("登录信息不能为空"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } if (StringUtils.isEmpty(user.getLoginId()) || StringUtils.isEmpty(user.getPwd())) { responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("用户名或密码不能为空"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } //查找用户 User user1 = userService.findUser(user); if (null == user1) { responseObj.setCode(ResponseObj.EMPUTY); responseObj.setMsg("未找到该用户"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } else { if (user.getPwd().equals(user1.getPwd())) { user1.setPwd(session.getId()); user1.setNextUrl(request.getContextPath() + "/mvc/home"); responseObj.setCode(ResponseObj.OK); //登录成功,状态为1 responseObj.setMsg(ResponseObj.OK_STR); responseObj.setData(user1); //登陆成功后返回用户信息 userService.updateLoginSession(request.getSession().getId(), user.getLoginId()); session.setAttribute("userInfo", user1); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } else { responseObj.setCode(ResponseObj.FAILED); responseObj.setMsg("用户密码错误"); jsonObject= (JSONObject) JSON.toJSON(responseObj); return jsonObject; } } }}

相关的登录注册页面我就放在github上吧,还有相关的js css image资源

我在使用过程中发现js,css资源不生效,

提示Absolute paths not recommended in JSP也就是
在JSP中不推荐使用绝对路径

解决方法

在相对路径前加上${pageContext.request.contextPath}这样JSP取得资源的绝对路径了

这里可以做前后端分离,用纯粹的html+js来调用Api接口实现前后端分离。下一个part写

action="<%=request.getContextPath()%>/userAction/reg" method="post"

<%=request.getContextPath()%>这是指向应用的根路径

mothod是说明我们请求的方式

Paste_Image.png

如果使用form表单提交时:

form表单中,每个input的name我们需要和后端的接口那边的字段对应。
当我们的字段对应后,spring可以自动把请求的内容转换为适应的对象。

存入数据库的信息有乱码

也就是说Form表单提交的时候出现乱码

spring框架提供的字符集过滤器
**spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题 **
可以使用过滤器处理乱码问题
需要在web.xml中加入

Set Character Encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf8
Set Character Encoding
/*

这些是登录注册的页面

Paste_Image.png
Paste_Image.png

主要参考于大牛的SSM集成之路

转载地址:http://qrhga.baihongyu.com/

你可能感兴趣的文章
数据中心机房设计及各专业技术平衡
查看>>
如何在Linux下安装PyCharm
查看>>
收集Java面试题知识点(Java基础部分三)
查看>>
全新WiFi技术问世 更适合智能家庭和物联网
查看>>
开机慢 不换SSD如何提升Windows 10开机速度
查看>>
Android键盘面板冲突 布局闪动处理方案
查看>>
阿里云E-MapReduce 创建执行计划
查看>>
数据中心里的应急关机技术
查看>>
偏见为什么是数据科学领域的一个大问题
查看>>
SAS实现四十年连续增长,2015年全球营收达31.6亿美元
查看>>
日本社交餐厅评论服务平台Retty获1050万美元D轮融资
查看>>
未来两年内的九大信息安全威胁(三)
查看>>
界面按钮太多 聊天机器人都快被玩坏了
查看>>
果断收藏!六大主流大数据采集平台架构分析
查看>>
嵌入式产品开发设计需要考虑的问题总结
查看>>
物联网还是联网物?
查看>>
以持续集成工具实现DevOps之禅
查看>>
InfoComm China 2016“全球新产品发布活动” —— 汇聚众多革新设备及技术
查看>>
格瑞光电:智慧城市建设的引领者
查看>>
超级寒潮考验智慧城市万亿投资
查看>>