7 登录功能

本章将实现系统登录功能,当用户输入正确的用户名和密码,进入系统主界面,当输入错误的用户名和密码,提示错误信息。涉及到的新知识点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。输入正确的用户和错误进行测试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值