controller包
package com.ward.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ward.entity.Admin;
import com.ward.service.ApplicationException;
import com.ward.service.LoginService;
/**
* 处理器类(二级控制器),相对于dispatcherServlet(一级控制器),
*
*
*/
@Controller
public class LoginController {
@Resource(name = "loginService")
private LoginService service;//业务层的
@RequestMapping("/toLogin.do")
public String toLogin() {
return "login";
}
@RequestMapping("login.do")
public String login(HttpServletRequest request,HttpSession session) {
// 读账号和密码
String adminCode = request.getParameter("adminCode");
String pwd = request.getParameter("pwd");
System.out.println("账号密码:" + adminCode + ";密码:" + pwd);
// 调用业务层的处理功能来处理登陆
try {
Admin admin = service.checkLogin(adminCode, pwd);
//在session对象中保存数据,在处理方法login()中添加参数HttpSession
//登陆成功后,绑定数据到session对象上。
session.setAttribute("admin", admin);
} catch (Exception e) {
e.printStackTrace();
if (e instanceof ApplicationException) {
// 应用异常
//请求对象绑定数据,绑定名"login-failed"
request.setAttribute("login_failed", e.getMessage());
return "login";
}
//系统异常
return "error";
}
//正常,登陆成功
return "redirect:toIndex.do";//重定向到首页
}
@RequestMapping("toIndex.do")
public String toIndex() {
return "index";
}
}
-----------------------------------------------dao包----------------------------------------------------------------
package com.ward.dao;
import com.ward.entity.Admin;
/**
*DAO接口
*接口的设计基本要求,接口方法不要涉及任何具体的技术。
*/
public interface AdminDAO {
public Admin findByAdminCode(String adminCode);
//设计的时候不要抛异常
}
----
----------------------------------------------
package com.ward.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.management.RuntimeErrorException;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import com.ward.entity.Admin;
/**
* DAO的实现类 采用具体的技术来实现接口的方法
*/
@Repository("adminDAO")
// 加这个注解,spring容器启动的时候,就会把它纳入容器进行管理,
// 相当于配置文件中多了一个bean id是adminDAO
public class AdminDAOjdbcImpl implements AdminDAO {
/**
* 依赖注入,注入DataSource,name指定注入的DataSource的id
*/
@Resource(name ="dataSource")
private DataSource ds;
public Admin findByAdminCode(String adminCode) {
Admin admin = null;
Connection conn = null;
PreparedStatement prep = null;
ResultSet rst = null;
try {
conn = ds.getConnection();
String sql="SELECT * FROM userinfo WHERE user_info=?";
prep=conn.prepareStatement(sql);
prep.setString(1, adminCode);
rst=prep.executeQuery();
if(rst.next()) {
admin=new Admin();
admin.setAdminId(rst.getInt("adminId"));
admin.setAdminCode(rst.getString("AdminCode"));
admin.setEmail(rst.getString("Email"));
admin.setName(rst.getString("name"));
admin.setEnrolldate(rst.getTimestamp("enrolldate"));
admin.setPassword(rst.getString("password"));
admin.setTelephone(rst.getString("telephone"));
}
} catch (Exception e) {
/**异常处理
* step1.记录日志(保留现场),一般都写在文件里面
*
*/
e.printStackTrace();
/**
* step2.异常发生后,要看异常能否恢复,如果不能恢复。
* (比如数据库服务暂停,网络中断等.即发生了系统异常)
* 则提示用户稍后重试,把异常往上抛给业务层
*/
throw new RuntimeException(e);
}finally {
/**
* jdbc规范:要求关闭连接时,
* 连接所创建的statement要自动关闭,
* statement创建的resultset也要自动关闭
*
* 有些连接池的实现,在关闭连接时,并没有关闭statement,
* 所以建议最好一次关闭resultset,statement和连接。
*/
if(conn!=null) {
try {
conn.close();
}catch (SQLException e) {
}
}
}
return admin;
}
}
----------------------------------------------entity包---------------------------------------------------------
package com.ward.entity;
import java.sql.Timestamp;
public class Admin {
private Integer adminId;
private String adminCode;
private String password;
private String name;
private String telephone;
private String email;
private Timestamp enrolldate;
public Timestamp getEnrolldate() {
return enrolldate;
}
public void setEnrolldate(Timestamp enrolldate) {
this.enrolldate = enrolldate;
}
public Integer getAdminId() {
return adminId;
}
public void setAdminId(Integer adminId) {
this.adminId = adminId;
}
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Admin [adminId=" + adminId + ", adminCode=" + adminCode + ", password=" + password + ", name=" + name
+ ", telephone=" + telephone + ", email=" + email + ", enrolldate=" + enrolldate + "]";
}
}
---------------------------------------------------service包----------------------------------------------------
package com.ward.service;
import com.ward.entity.Admin;
/**
*业务接口
*/
public interface LoginService {
public Admin checkLogin(String adminCode,String pwd);
}
--------------------------------------------------------------------------
package com.ward.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.ward.dao.AdminDAO;
import com.ward.entity.Admin;
/**
* 业务实现类
*/
//业务层的
@Service("loginService")
public class LoginServiceImpl implements LoginService{
//依赖注入的时候,注入的类型要是接口类型
@Resource(name="adminDAO")
public AdminDAO dao;
public Admin checkLogin(String adminCode, String pwd) {
/**
* 查询数据库,如果有满足条件的记录,返回一个完整的admin对象,
* 表示登陆成功,否则抛出相应的应用异常。
*/
Admin admin=dao.findByAdminCode("");
if(admin==null) {
//如果为空,表示账号错误,不存在,抛出应用异常
throw new ApplicationException("账号不存在");
}
if(!admin.getPassword().equals(pwd)) {
throw new ApplicationException("密码错误");
}
return admin;
}
}
------------------
-------------------------------
package com.ward.service;
/**
*这是一个应用异常,输入错误的账号,密码等,不满足业务规则的异常引起的。
*
*/
public class ApplicationException extends RuntimeException {
public ApplicationException() {
super();
}
public ApplicationException(String message) {
super(message);
}
}
---------------------db.properties文件-------------------------------
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:testadmin
user=system
password=Tian416058
----------------------------------------------spring-mvc.xml文件-----------------------------------------------------------
<!-- 配置DataSource:DAO需要访问数据库,需要连接,
通过DataSource获得连接 close方法是DataSource的 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{jdbc.driver}"></property>
<property name="url" value="#{jdbc.url}"></property>
<property name="username" value="#{jdbc.user}"></property>
<property name="password" value="#{jdbc.password}"></property>
</bean>
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.ward"></context:component-scan>
<!-- 配置mvc注解扫描 -->
<mvc:annotation-driven/>
<!--配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置拦截器,用来做session验证的 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/toLogin.do"/>
<mvc:exclude-mapping path="/login.do"/>
<bean class="com.ward.interceptor.SessionInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
-----------------------------------------------------------------------WEB-INF包----login.jsp
---------------------------------------------------------------------------
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>first spring-mvc</title>
</head>
<body style="font-size: 30px;font-style: italic;">
<form action="login.do" method="post">
<span class="required">${login_failed}</span>
</form>
</body>
</html>
-------------------------------------------------web.xml--------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 过滤器:中文乱码解决 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet的初始化方法会启动spring
容器,所以需要配置初始化参数来指定spring配置文件的位置
如果没有配置初始化参数,则会找WEB-INF/*-servlet.xml ,*与前端控制器的name一样 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>