工程目录结构:
配置pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cq</groupId>
<artifactId>springMVC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build/>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.9.Final</version>
</dependency>
</dependencies>
</project>
配置application-core.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="jdbcUrl"
value="jdbc:oracle:thin:@localhost:1521:xe">
</property>
<property name="user" value="cq"></property>
<property name="password" value="123456"></property>
<property name="minPoolSize"><value>1</value></property>
<property name="maxPoolSize"><value>20</value></property>
<property name="maxIdleTime"><value>1800</value></property>
<property name="acquireIncrement"><value>2</value></property>
<property name="maxStatements"><value>0</value></property>
<property name="initialPoolSize"><value>2</value></property>
<property name="idleConnectionTestPeriod"><value>1800</value></property>
<property name="acquireRetryAttempts"><value>30</value></property>
<property name="breakAfterAcquireFailure"><value>true</value></property>
<property name="testConnectionOnCheckout"><value>false</value></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.it.bean</value>
</list>
</property>
</bean>
<!-- 事务管理器 -->
<bean id="htm" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 事务管理的注解驱动 -->
<tx:annotation-driven transaction-manager="htm"/>
<!-- spring 扫描 -->
<context:component-scan base-package="com.it"></context:component-scan>
<!-- mvc注解驱动 -->
<mvc:annotation-driven />
<!--通用视图解析器 -->
<bean id="viewResolverCommon" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:resources location="/static/" mapping="/static/**"
cache-period="3600" />
</beans>
配置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">
<display-name>ssh_pri</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:application-*.xml </param-value>
</context-param>
<!-- 配置监听以实例化Spring上下文 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 编码 -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- hibernate 的session在request中有效 -->
<filter>
<filter-name>lazyLoadingFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>lazyLoadingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- springmvc 前端控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
配置log4j.properties
#log level
log4j.rootLogger=info,R,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
#Log4j提供的appender有以下几种:
#org.apache.log4j.ConsoleAppender(控制台),
#org.apache.log4j.FileAppender(文件),
#org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
#org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
#org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#其中log4j提供4种布局.
#org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
# log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
#log4j.appender.stdout.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#log4j.appender.stdout.layout.ConversionPattern=[%t-%d{HH\:mm\:ss} (%F\:%L)] %m%n
#R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#日志文件的名称
log4j.appender.R.File=d:/logs.log
#日志文件的大小
log4j.appender.R.Append=true
# Keep one backup file
#保存一个备份文件
log4j.appender.R.Threshold=INFO
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[NEOP]%-d{yyyy-MM-dd HH:mm:ss} (%c:%L)(%t) [%p] %m%n
log4j.appender.R.DatePattern='.'yyyy-MM-dd'.log'
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.org.apache=INFO
log4j.logger.org.mybatis=INFO
log4j.logger.com.ibatis=INFO
log4j.logger.java.sql=INFO
log4j.logger.org.springframework=INFO
bean
Student
package com.it.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="Student")
public class Student implements Serializable {
@Id
@Column(name="stu_id")
private String stu_id;
@Column(name="stu_pwd")
private String stu_pwd;
@Column(name="stu_name")
private String stu_name;
@Column(name="stu_sex")
private String stu_sex;
@Column(name="stu_age")
private String stu_age;
@Column(name="stu_addr")
private String stu_addr;
public String getStu_id() {
return stu_id;
}
public void setStu_id(String stu_id) {
this.stu_id = stu_id;
}
public String getStu_pwd() {
return stu_pwd;
}
public void setStu_pwd(String stu_pwd) {
this.stu_pwd = stu_pwd;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_sex() {
return stu_sex;
}
public void setStu_sex(String stu_sex) {
this.stu_sex = stu_sex;
}
public String getStu_age() {
return stu_age;
}
public void setStu_age(String stu_age) {
this.stu_age = stu_age;
}
public String getStu_addr() {
return stu_addr;
}
public void setStu_addr(String stu_addr) {
this.stu_addr = stu_addr;
}
public Student(String stu_id, String stu_pwd, String stu_name,
String stu_sex, String stu_age, String stu_addr) {
super();
this.stu_id = stu_id;
this.stu_pwd = stu_pwd;
this.stu_name = stu_name;
this.stu_sex = stu_sex;
this.stu_age = stu_age;
this.stu_addr = stu_addr;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
}
dao
BaseDAO
package com.it.dao;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import com.it.bean.Student;
public class BaseDAO<E> extends HibernateDaoSupport{
@Resource
public void setSuperSessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
public void add(E e){
this.getHibernateTemplate().save(e);
}
public void del(E e){
this.getHibernateTemplate().delete(e);
}
public void upd(E e){
this.getHibernateTemplate().update(e);
}
@SuppressWarnings("unchecked")
public List<E> findAll(String hql){
return (List<E>) this.getHibernateTemplate().find(hql);
}
@SuppressWarnings("unchecked")
public E findById(String stu_id){
E e=(E) this.getHibernateTemplate().get(Student.class, stu_id);
return e;
}
}
StudentDAO
package com.it.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.it.bean.Student;
@Repository(value="studao")
public class StudentDAO extends BaseDAO<Student>{
public void add(Student stu){
super.add(stu);
}
public void upd(Student stu){
super.upd(stu);
}
public void del(Student stu){
super.del(stu);
}
public List<Student> findAll(Student stu){
String hql="from Student";
return super.findAll(hql);
}
}
service
StudentService
package com.it.service;
import java.util.List;
import javax.annotation.Resource;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.it.bean.Student;
import com.it.dao.StudentDAO;
@Service(value="stusv")
public class StudentService {
@Resource(name="studao")
private StudentDAO studao;
@Transactional
public void add(Student stu){
studao.add(stu);
}
@Transactional
public void upd(Student stu){
studao.upd(stu);
}
@Transactional
public void del(Student stu){
studao.del(stu);
}
@Transactional
public List<Student> findAll(Student stu){
return studao.findAll(stu);
}
@Transactional
public Student findById(String stu_id){
return (Student)studao.findById(stu_id);
}
}
action
StudentAction
package com.it.action;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.it.bean.Student;
import com.it.service.StudentService;
@Controller
public class StudentAction {
@Resource(name="stusv")
private StudentService stusv;
@RequestMapping("/add")
public String add(Student stu){
System.out.println("---------1------");
stusv.add(stu);
return "redirect:/show";
}
@RequestMapping("/upd")
public String upd(Student stu){
System.out.println("---------1------");
stusv.upd(stu);
return "redirect:/show.do";
}
@RequestMapping("/del")
public String del(Student stu){
System.out.println("---------1------");
stusv.del(stu);
return "redirect:/show.do";
}
@RequestMapping("/show")
public ModelAndView findAll(Student stu){
System.out.println("----------2----------");
List<Student> list=this.stusv.findAll(stu);
ModelAndView mv=new ModelAndView("show");
mv.addObject("list", list);
return mv;
}
@RequestMapping("/findById")
public String findById(HttpSession session,String stu_id){
System.out.println("----------3----------");
Student stu=this.stusv.findById(stu_id);
System.out.println("----------4---------");
session.setAttribute("stu", stu);
return "upd";
}
}
jsp
add.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="add" method="post">
ID:<input type="text" name="stu_id"/><br>
PWD:<input type="text" name="stu_pwd"/><br>
NAME:<input type="text" name="stu_name"/><br>
SEX:<input type="text" name="stu_sex"/><br>
AGE:<input type="text" name="stu_age"/><br>
ADDR:<input type="text" name="stu_addr"/><br>
<input type="submit" value="添加"/>
</form>
</body>
</html>
show.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'show.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function openLogin(){
document.getElementById("win").style.display="";
}
function closeLogin(){
document.getElementById("win").style.display="none";
}
</script>
</head>
<body>
<table>
<tr>
<td>编号</td>
<td>密码</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>地址</td>
<td>操作</td>
<td><a href="add.jsp" id="add">添加</a></td>
</tr>
<c:forEach items="${list }" var="l">
<tr>
<td>${l.stu_id }</td>
<td>${l.stu_pwd }</td>
<td>${l.stu_name }</td>
<td>${l.stu_sex }</td>
<td>${l.stu_age }</td>
<td>${l.stu_addr }</td>
<td><a href="del.do?stu_id=${l.stu_id }">删除</a></td>
<td><a href="findById.do?stu_id=${l.stu_id }">修改</a></td>
</tr>
</c:forEach>
<a href="stu/show.action?currentPage=${(currentPage-1)<=1?1:(currentPage-1)}"><< </a>
<a href="stu/show.action?currentPage=${(currentPage+1)>totalPage?totalPage:(currentPage+1)}"> >></a>
</table>
</body>
</html>
upd.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'MyJsp.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="upd" method="post">
ID:<input type="text" name="stu_id" value="${stu.stu_id}"/><br>
PWD:<input type="text" name="stu_pwd" value="${stu.stu_pwd}"/><br>
NAME:<input type="text" name="stu_name" value="${stu.stu_name}"/><br>
SEX:<input type="text" name="stu_sex" value="${ stu.stu_sex}"/><br>
AGE:<input type="text" name="stu_age" value="${ stu.stu_age}"/><br>
ADDR:<input type="text" name="stu_addr" value="${ stu.stu_addr}"/><br>
<input type="submit" value="修改"/>
</form>
</body>
</html>