设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

Spring实现登陆功能Demo

2014-11-27 14:56:00.0 JavaWeb spring web java javaweb  
导读:最近学习SSH框架,看到Spring部分,下面通过实现一个登陆Demo来学习Spring的工作流程,配置,注解的使用等知识点。1、在Eclipse下新建名为SpringDemo的Dynamic Web Project项目,导入spring相关jar包到lib目录下。此外,项目还需导入aopallince、commons-logging、commons-dbcp、commons-collection...。。。

最近学习SSH框架,看到Spring部分,下面通过实现一个登陆Demo来学习Spring的工作流程,配置,注解的使用等知识点。

1、在Eclipse下新建名为SpringDemo的Dynamic Web Project项目,导入spring相关jar包到lib目录下。

此外,项目还需导入aopallince、commons-logging、commons-dbcp、commons-collections、commons-pool等依赖jar包;

jsp页面使用了JSTL,因此需要在原lib基础上增加jstl.jar和standard.jar;数据库链接需mysql-connector-java包。

有时还需根据控制台的出错异常信息,导入缺少的jar包。


2、在web.xml下对Spring进行相关配置。

web.xml内容如下:

 SpringDemo   webAppRootKey  SpringDemo.webapp.root       log4jConfigLocation  classpath:log4j.xml      log4fRefreshInterval  60000      contextConfigLocation  /WEB-INF/applicationContext.xml         org.springframework.web.context.ContextLoaderListener      org.springframework.web.util.Log4jConfigListener      spring  org.springframework.web.servlet.DispatcherServlet     contextConfigLocation   /WEB-INF/dispatcherServlet.xml        spring  *.do    index.html  index.htm  index.jsp 
3、在applicationContext.xml中配置Spring注解、数据库等信息

                                                     
p:dataSource-ref="dataSource" />

其中引用的database.properties文件内容如下:

dataSource.driverClassName=com.mysql.jdbc.DriverdataSource.url=jdbc:mysql://localhost:3306/UserdataSource.username=rootdataSource.password=123456dataSource.maxActive=200dataSource.maxIdle=50dataSource.maxWait=10000
4、在dispatcherServlet.xml中,配置控制层、AOP、视图解析等信息。

                       

“org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter”直接关系到多动作控制器配置是否可用!必须配置正确

5、新建Account实体类

package com.demo.domain;import java.io.Serializable;public class Account implements Serializable {  /**  *   */ private static final long serialVersionUID = 1862537539462186097L;  private Integer id; private String username; private String password; public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } public String getUsername() {  return username; } public void setUsername(String username) {  this.username = username; }  public String getPassword() {  return password; } public void setPassword(String password) {  this.password = password; }  public Account(){}}
6、新建AccountDAO接口

package com.demo.dao;import com.demo.domain.Account;public interface AccountDao {  int getMatchCount(String username, String password); Account getAcoountById(int id); Account getAccountByName(String username);}
7、新建AccountDaoImpl实现AccountDao接口,并配置@Repository注解,@Autowired注入jdbcTemplate用来访问数据库。

package com.demo.dao.impl;import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowCallbackHandler;import org.springframework.stereotype.Repository;import com.demo.dao.AccountDao;import com.demo.domain.Account;@Repositorypublic class AccountDaoImpl implements AccountDao { @Autowired private JdbcTemplate jdbcTemplate;  @Override public int getMatchCount(String username, String password) {  String strSql = "select count(*) from user "    + " where name = ? and password = ?";//?为参数占位符    return jdbcTemplate.queryForInt(strSql, new Object[]{ username, password}); } @Override public Account getAcoountById(int id) {  String strSql = "select id,name from user "    + " where id = ?";  System.out.println("##########execute sql: "+strSql);  final Account account = new Account();  jdbcTemplate.query(strSql, new Object[]{ id },    //匿名方式实现的回调函数    new RowCallbackHandler(){         @Override     public void processRow(ResultSet rs) throws SQLException {      //将查询结果封装到对象实例中      account.setId(rs.getInt("id"));      account.setUsername(rs.getString("name"));     }     });  return account; } @Override public Account getAccountByName(String username) {  String strSql = "select id,name from user "    + " where name = ?";  System.out.println("##########execute sql: "+strSql);  final Account account = new Account();  jdbcTemplate.query(strSql, new Object[]{ username },    //匿名方式实现的回调函数    new RowCallbackHandler(){         @Override     public void processRow(ResultSet rs) throws SQLException {      //将查询结果封装到对象实例中      account.setId(rs.getInt("id"));      account.setUsername(rs.getString("name"));     }     });  return account; }}
8、新建AccountService接口。

package com.demo.service;import com.demo.domain.Account;public interface AccountService {  boolean hasMatchAccount(String username, String password); Account getAccountById(int id); Account getAccountByName(String username);}
9、新建AccountServiceImpl类实现AccountService接口,并配置@Service注解,@Autowried注入AccountDao用来访问DAO

package com.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.demo.dao.AccountDao;import com.demo.domain.Account;import com.demo.service.AccountService;@Servicepublic class AccountServiceImpl implements AccountService{ @Autowired private AccountDao accountDao;  @Override public boolean hasMatchAccount(String username, String password) {  return accountDao.getMatchCount(username, password)>0; } @Override public Account getAccountById(int id) {  return accountDao.getAcoountById(id); } @Override public Account getAccountByName(String username) {  return accountDao.getAccountByName(username); }}
10、新建LoginController类,并配置@Controller注解,@Autowired注入AccountService;用来响应login请求。

package com.demo.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.demo.domain.Account;import com.demo.service.AccountService;@Controllerpublic class LoginController {  @Autowired private AccountService accountService;  /**  * init login form  * @param model  * @return  */ @RequestMapping(value="/login.do", method = RequestMethod.GET) public String initForm(ModelMap model){  System.out.println("########## init login page.");  Account account = new Account();  //绑定账户对象,也就是这个登录表单对象  model.addAttribute("account", account);  //指向登录页面  return "login"; }  /**  * login check  * @param user  * @return  */ @RequestMapping(value="/loginCheck.do",method = RequestMethod.POST)      public String login(@ModelAttribute("user") Account account) {         Account account2 = accountService.getAccountByName(account.getUsername());        if (account2 != null) {              return "redirect:profile.do?id=" + account2.getId();          } else {              return "redirect:login.do";          }      }  }
11、新建AccountController类,并配置@Controller注解,@Autowired注入AccountService;用来响应profile请求。

package com.demo.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import com.demo.domain.Account;import com.demo.service.AccountService;@Controllerpublic class AccountController {  @Autowired private AccountService accountService;  /**  *   * @param id  * @param model  * @return  */ @RequestMapping(value="/profile.do",method = RequestMethod.GET) public String proflie(@RequestParam("id") int id, ModelMap model){  Account account = accountService.getAccountById(id);  model.addAttribute("account", account);  //跳转到用户信息界面  return "profile"; }}
12、以上接口和类的结构图如下:

在上面的类中,都是用注解来进行配置。注解的确减少了代码的开发量,提高了效率。当然,这对于我们理解程序是一种挑战!如果你不知道原有的SpringMVC的流程,很难一开始就能摆弄清楚这些内容!

13、在WEB-INF目录下新建views文件夹,建立需要的jsp页面。

login.jsp内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ include file="/WEB-INF/views/taglib.jsp"%> Login Page
登录
  • 用户名:
  • 密码:
profile.jsp内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>Profile Page
用户信息
taglib.jsp内容如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%><%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%><%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
14、WEB-INF目录内容结构图如下:

15、整个项目Demo的编码工作基本就是这样。运行效果如下图:

登陆界面

用户信息界面:

16、总结:通过实现一个登陆Demo,学习了一下Spring框架的基本使用,项目比较简单,因此还有很多知识点未能涉及到。

Spring作为一个非常优秀的框架,可以号称“全栈框架”。

但是,从代码中依然可以看到Spring框架的不足。DAO层的数据库操作代码比较繁琐,而这里就有了ORM框架的用武之地。

Hibernate甚至连sql都不用写,就可实现常见的增删查改操作。

Spring作为一个开放性框架,能非常便捷的整合ORM框架。


(编辑: dutsoft)

网友评论
相关文章