登录注册
首先,我们webapp要实现用户登录,必须得能新建用户。所以先把注册用户放在前面。
预期功能:打开注册页面
填写注册信息
点击注册
显示注册后的提示信息
一个web注册页面
web页面能进行基本的数据效验
服务器能存储用户的注册信息
注册动作完成后,返回提示页面。
一般在开发中,有了大概样子的功能模块,需要整理一下业务流程和程序执行流程
大概的流程图如下所示:
[图片上传失败...(image-5d396d-1536456883937)]
上图说明:
在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
是说明我们请求的方式
如果使用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>
这些是登录注册的页面
主要参考于大牛Clone丶记忆的SSM集成之路