spring+springMVC+mybatis的整合 part6

简介: 登录注册首先,我们webapp要实现用户登录,必须得能新建用户。所以先把注册用户放在前面。预期功能:打开注册页面填写注册信息点击注册显示注册后的提示信息一个web注册页面web页面能进行基本的数据效验服务器能存储用户的注册信息注册动作完成后,返回提示页面。

登录注册

首先,我们webapp要实现用户登录,必须得能新建用户。所以先把注册用户放在前面。
预期功能:打开注册页面
填写注册信息
点击注册
显示注册后的提示信息

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

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


上图说明:
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 <T>{
    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

具体使用:http://www.jianshu.com/p/3c45f4be2c90
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<User>();
        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<User>();
        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取得资源的绝对路径了

<script type="text/javascript" 
src="${pageContext.request.contextPath}/static/js/jquery-3.1.1.min.js"></script>

这里可以做前后端分离,用纯粹的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中加入

<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这些是登录注册的页面

Paste_Image.png
Paste_Image.png

主要参考于大牛Clone丶记忆的SSM集成之路

目录
相关文章
|
9天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
87 29
|
20天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
36 2
|
1月前
|
SQL JavaScript Java
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
本文介绍了如何在Spring Boot 3中整合MyBatis-Plus实现数据权限控制,通过使用MyBatis-Plus提供的`DataPermissionInterceptor`插件,在不破坏原有代码结构的基础上实现了细粒度的数据访问控制。文中详细描述了自定义注解`DataScope`的使用方法、`DataPermissionHandler`的具体实现逻辑,以及根据用户的不同角色和部门动态添加SQL片段来限制查询结果。此外,还展示了基于Spring Boot 3和Vue 3构建的前后端分离快速开发框架的实际应用案例,包括项目的核心功能模块如用户管理、角色管理等,并提供Gitee上的开源仓库
190 11
|
2月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
63 4
|
2月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
125 4
|
2月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
144 3
|
9月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
137 0
|
前端开发 Java 程序员
38SpringMVC - SpringMVC架构
38SpringMVC - SpringMVC架构
55 0
|
4月前
|
存储 设计模式 前端开发
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
文章解释了SpringMVC的概念和各部分功能,探讨了应用分层的原因和具体实施的三层架构,以及SpringMVC与三层架构之间的关系和联系。
44 1
什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构?SpringMVC与三层架构的关系?
|
8月前
|
安全 前端开发 Java
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
70 1