本章将实现系统登录功能,当用户输入正确的用户名和密码,进入系统主界面,当输入错误的用户名和密码,提示错误信息。涉及到的新知识点JSON。
在《6 模型驱动》我们在初始化表单时代码如下:
//初始化表单
$("#login_loginForm").form({
url:"${pageContext.request.contextPath}/userAction!login.action",
success:function(data){
var obj = eval("(" + data + ")");
if(obj.success){
//用户密码正确,跳转主页面
window.location.href = "index.jsp";
}else{
//提示错误信息
$.messager.alert("提示", obj.msg, "warning");
}
}
});
注意此段代码:
success:function(data){
……
}
它表示 form 表单提交到 url 成功后,服务器返回给前台页面的信息,返回的信息通过JSON格式传输。
那么如何在login方法中返回信息给前台页面呢?JSON又是什么东西呢?
1 JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 数据的书写格式是:名称/值对。如:
{"username":"admin"}
JSON简单说就是javascript中的对象。对象在js中表示为“{}”括起来的内容,数据结构为:
{key:value, key:value, ...}
上面为键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为【对象.key】获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2 返回JSON
有了JSON知识后,我们将使用阿里巴巴JSON工具 :【FastJson】,它是一个Json处理工具包,包括“序列化”和“反序列化”两部分。能够快速帮我们构建JSON。序列化:就是把JavaBean对象转化成JSON格式的文本。反序列化:就是将JSON格式文本转化成对象。
要使用FastJson,我们需要在pom.xml配置文件中加入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.39</version>
</dependency>
如何将对象转换为JSON,并返回给前台页面login呢?首先我们在ilv.pageModel包中创建一个对象Json,专门负责返回信息给前台。
代码清单1:Json.java
package ilv.pageModel;
import java.io.Serializable;
public class Json implements Serializable {
//返回结果
private boolean success = false;
//返回信息
private String msg = "";
//返回对象
private Object object = null;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
有了Json对象后,我们在login方法中创建此对象,并赋值,然后调用阿里巴巴提供的Fastjson对象,将Json对象转换为JSON格式字符串,并返回给前台login.jsp页面。修改UserAction类中的login方法。
public void login(){
//创建Json对象
Json json = new Json();
json.setSuccess(true);
json.setMsg("测试返回数据");
//将Json对象转换为JSON字符串
String strJson = JSON.toJSONString(json);
//打印JSON字符串
System.out.println(strJson);
//设置返回字符编码
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
try {
//将JSON数据返回前台
ServletActionContext.getResponse().getWriter().write(strJson);
ServletActionContext.getResponse().getWriter().flush();
ServletActionContext.getResponse().getWriter().close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在登录界面输入用户名好密码,点击登录。在控制台将会看到打印的JSON数据。
可见json对象被转换为JSON格式数据:
{"msg":"测试返回数据","success":true}
3 前台处理返回数据
通过Fastjson对象,将数据返回给login.jsp页面。表示表单form提交成功,触发success方法。
success:function(data){
//将JSON数据转换为JS对象
var obj = eval("(" + data + ")");
if(obj.success){
//用户密码正确,跳转主页面
window.location.href = "index.jsp";
}else{
//提示错误信息
$.messager.alert("提示", obj.msg, "warning");
}
}
success方法中,首先将返回的JSON数据转换为JS对象,然后判断返回的success属性,判断是否登录成功。由于我们直接返回success为true,因此,页面跳转到index.jsp。
4 判断用户是否存在
4.1 修改Dao
有了前面的基础,我们就可以编写登录功能,首先在UserDao中增加获取用户接口。
代码清单2:UserDaoI.java
package ilv.dao;
import ilv.model.IlvUser;
import java.io.Serializable;
public interface UserDaoI {
public Serializable save(IlvUser user);
//查找用户,不存在返回null
public IlvUser get(String hql);
}
在UserDaoImpl中实现此接口。
代码清单3:UserDaoImpl.java
package ilv.dao.impl;
import ilv.dao.UserDaoI;
import ilv.model.IlvUser;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
//注解方式,让spring管理
//dao类推荐@Repository,service类推荐@Service
@Repository("UserDao")
public class UserDaoImpl implements UserDaoI{
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
//当创建UserDaoImpl时,sessionFactory自动被创建注入
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public Serializable save(IlvUser user) {
// TODO Auto-generated method stub
return this.sessionFactory.getCurrentSession().save(user);
}
@Override
public IlvUser get(String hql) {
// TODO Auto-generated method stub
Query q = this.sessionFactory.getCurrentSession().createQuery(hql);
List<IlvUser> l = q.list();
//存在用户返回对象,否则返回空
if (l != null && l.size() > 0) {
return l.get(0);
} else {
return null;
}
}
}
4.2 修改Service
给UserServiceI增加 findUser 接口。
代码清单4:UserServiceI.java
package ilv.service;
import ilv.model.IlvUser;
import ilv.pageModel.User;
import java.io.Serializable;
public interface UserServiceI {
public void test();
public Serializable save(IlvUser user);
//查找用户
public Boolean findUser(User user);
}
在UserServiceImpl类中实现此接口。
代码清单5:UserServiceImpl.java
package ilv.service;
import ilv.dao.UserDaoI;
import ilv.model.IlvUser;
import ilv.pageModel.User;
import java.io.Serializable;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "userService")
public class UserServiceImpl implements UserServiceI {
/**
* Logger for this class
*/
private static final Logger logger = Logger
.getLogger(UserServiceImpl.class);
// 需要用到userDaoImpl操纵表TUSER
private UserDaoI userDao;
public UserDaoI getUserDao() {
return userDao;
}
// 创建UserServiceImpl时,userDao被自动创建
@Autowired
public void setUserDao(UserDaoI userDao) {
this.userDao = userDao;
}
@Override
public void test() {
logger.info("打印信息");
}
@Override
public Serializable save(IlvUser user) {
//调用数据库操作类UserDao操纵数据库
return userDao.save(user);
}
@Override
public Boolean findUser(User user) {
// TODO Auto-generated method stub
String hql = "from IlvUser where username = '"
+ user.getUsername() + "' and password = '"
+ DigestUtils.md5Hex(user.getPassword()) + "'";
if(userDao.get(hql) != null){
return true;
}else{
return false;
}
}
}
4.3 修改Action
public void login(){
//创建Json对象
Json json = new Json();
if(userService.findUser(user)){
json.setSuccess(true);
json.setMsg("登录成功!");
}else{
json.setSuccess(false);
json.setMsg("登录失败!");
}
//将Json对象转换为JSON字符串
String strJson = JSON.toJSONString(json);
//打印JSON字符串
System.out.println(strJson);
//设置返回字符编码
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
try {
//将JSON数据返回前台
ServletActionContext.getResponse().getWriter().write(strJson);
ServletActionContext.getResponse().getWriter().flush();
ServletActionContext.getResponse().getWriter().close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.4 修改web.xml
在web.xml配置文件中增加openSessionInView配置。
<!-- openSessionInView配置 -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
重新关联项目,重启Tomcat。输入正确的用户和错误进行测试。