刚学习springmvc不久,各种配置我怕记不住,就写个随笔记录一下。
我的项目是springmvc+hibernate4。环境是windows+myeclipse(或eclipse)+jdk7+tomcat7+mysql
项目文件层级关系如图所示:
配置springmvc+hibernate4步骤:(如果使用hibernate3会有一些差别)
第一步:引入jar包。第一次为了方便,我将很多jar包和依赖包全部直接拷进去了,实际上只需要一部分。具体需要什么,就加什么,可以在网上查到。
注意:把jar包导入后需要对所有包Add to Build Path;然后对工程名右键Build Path——>configure Build Path——>Add External JARS选择tomcat路径,添加"servlet-api.jar" "el-api.jar" "jsp-api.jar" 这三个jar包。
第二步:配置数据源,注解扫描包。spring-context.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- 注解扫描包 -->
<context:component-scan base-package="main.java.lms" />
<!-- 开启注解 -->
<context:annotation-config />
<!--数据源-mysql -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/laboratory" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!--数据源-sqlserver -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=laboratory"/>
<property name="username" value="root" /> <property name="password" value="root"
/> </bean> -->
<!--数据源-oracle -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property
name="username" value="root" /> <property name="password" value="root" />
</bean> -->
<!-- Hibernate SessionFactory,hibernate3为class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" -->
<!--设置属性说明 -->
<!--hibernate.dialect设置方言 -->
<!--hibernate.format_sql输出格式化的sql -->
<!--hibernate.show_sql控制台输出sql -->
<!--hibernate.hbm2ddl.auto 自动创建|更新|验证数据库表结构。有以下几个参数:
create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了
但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 -->
<!--current_session_context_class使用缓存机制。(hibernate3:Thread或jta);(hibernate4:org.springframework.orm.hibernate4.SpringSessionContext) -->
<!--hibernate.cache.provider_class 使用Ehcache缓存;hibernate3是org.hibernate.cache.HashtableCacheProvider;hibernate4是net.sf.ehcache.hibernate.EhCacheProvider -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> -->
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!--自动扫描(实体类)注解包 -->
<property name="packagesToScan" value="main.java.lms"></property>
</bean>
</beans>
第三步:配置试图解析器等,springmvc-context.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- 注解扫描包 -->
<context:component-scan base-package="main.java.lms" />
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<!-- spring mvc 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!--spring对hibernate的事务管理 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 自动扫描事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- <bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView">
<value>error</value>
</property>
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean> -->
<import resource="spring-context.xml" />
</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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LaboratorySystemSpringmvc</display-name>
<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>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--getCurrentSession()事务会自动关闭,所以在所有jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入下面这个 -->
<filter>
<filter-name>SpringOpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SpringOpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
第五步:新建实例
package main.java.lms.entities;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
/**
* 用户表
*
*/
@Entity
@Table(name="lms_user")
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1461373625778051299L;
private int userId;
private String loginNumber;// 登陆名,即学号或工号
private String loginPassword;
private String userName;
private String userIdentity;// 身份:学生,老师管理员:3,2,1
// 用户扩展表(与用户一对一级联关系)
private UserExtends userExtends;
public User(String loginNumber, String loginPassword) {
this.loginNumber = loginNumber;
this.loginPassword = loginPassword;
}
public User() {
}
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="user_ex_loginName",unique=true,referencedColumnName="user_ex_loginName")
public UserExtends getUserExtends() {
return userExtends;
}
public void setUserExtends(UserExtends userExtends) {
this.userExtends = userExtends;
}
@Id
@Column(name = "user_id", unique = true, nullable = false)
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
@Column(name = "user_loginName", unique = true, nullable = false)
public String getLoginNumber() {
return loginNumber;
}
public void setLoginNumber(String loginNumber) {
this.loginNumber = loginNumber;
}
@Column(name = "user_loginPassword", nullable = false)
public String getLoginPassword() {
return loginPassword;
}
public void setLoginPassword(String loginPassword) {
this.loginPassword = loginPassword;
}
@Column(name = "user_name", nullable = false)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "user_identity", nullable = false)
public String getUserIdentity() {
return userIdentity;
}
public void setUserIdentity(String userIdentity) {
this.userIdentity = userIdentity;
}
}
package main.java.lms.entities;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
/**
* 用户扩展表
*
*/
@Entity
@Table(name = "lms_userextends")
public class UserExtends implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8046904045928469438L;
// 用户(与用户扩展表一对一级联关系)
private User user;
private String userExLoginNumber;
private int sex;
private String idCard;
private String national;// 民族
private String politicalLandscape;// 政治面貌
private String placeOfOrigin;// 籍贯
private String studyType;// 学生类别,本科专科:1本2专
private String studentDepartment;// 所在系别
private String studentProfessional;// 专业
private String studentProfessionalDirection;// 专业方向
private int stduentClass;// 班级
private int grade;// 年级
private String workDepartment;// 工作部门单位
private String workPosition;// 工作职位
private String workTitle;// 职称
private String phoneNumber;
private String email;
private String address;
private int postalCode;
@OneToOne(mappedBy="userExtends",cascade=CascadeType.ALL)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Id
@Column(name = "user_ex_loginName", unique = true, nullable = false)
public String getUserExLoginNumber() {
return userExLoginNumber;
}
public void setUserExLoginNumber(String userExLoginNumber) {
this.userExLoginNumber = userExLoginNumber;
}
@Column(name = "user_sex")
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@Column(name = "user_idCard")
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
@Column(name = "user_national")
public String getNational() {
return national;
}
public void setNational(String national) {
this.national = national;
}
@Column(name = "user_politicalLandscape")
public String getPoliticalLandscape() {
return politicalLandscape;
}
public void setPoliticalLandscape(String politicalLandscape) {
this.politicalLandscape = politicalLandscape;
}
@Column(name = "user_placeOfOrigin")
public String getPlaceOfOrigin() {
return placeOfOrigin;
}
public void setPlaceOfOrigin(String placeOfOrigin) {
this.placeOfOrigin = placeOfOrigin;
}
@Column(name = "user_studyType")
public String getStudyType() {
return studyType;
}
public void setStudyType(String studyType) {
this.studyType = studyType;
}
@Column(name = "user_studentDepartment")
public String getStudentDepartment() {
return studentDepartment;
}
public void setStudentDepartment(String studentDepartment) {
this.studentDepartment = studentDepartment;
}
@Column(name = "user_studentProfessional")
public String getStudentProfessional() {
return studentProfessional;
}
public void setStudentProfessional(String studentProfessional) {
this.studentProfessional = studentProfessional;
}
@Column(name = "user_studentProfessionalDirection")
public String getStudentProfessionalDirection() {
return studentProfessionalDirection;
}
public void setStudentProfessionalDirection(
String studentProfessionalDirection) {
this.studentProfessionalDirection = studentProfessionalDirection;
}
@Column(name = "user_studentClass")
public int getStduentClass() {
return stduentClass;
}
public void setStduentClass(int stduentClass) {
this.stduentClass = stduentClass;
}
@Column(name = "user_grade")
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Column(name = "user_workDepartment")
public String getWorkDepartment() {
return workDepartment;
}
public void setWorkDepartment(String workDepartment) {
this.workDepartment = workDepartment;
}
@Column(name = "user_workPosition")
public String getWorkPosition() {
return workPosition;
}
public void setWorkPosition(String workPosition) {
this.workPosition = workPosition;
}
@Column(name = "user_workTitle")
public String getWorkTitle() {
return workTitle;
}
public void setWorkTitle(String workTitle) {
this.workTitle = workTitle;
}
@Column(name = "user_phoneNumber")
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Column(name = "user_email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name = "user_address")
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Column(name = "user_postalCode")
public int getPostalCode() {
return postalCode;
}
public void setPostalCode(int postalCode) {
this.postalCode = postalCode;
}
}
第六步:controller层
@Controller
public class UserController {
@Autowired
private UserServices userServices;/**
* 映射首页的地址,如果已登录跳转到首页,未登录跳转到登录界面
* @param request
* @param response
* @return
*/
@RequestMapping(value="/index.html",method=RequestMethod.GET)
public String toIndex(HttpServletRequest request,HttpServletResponse response){
HttpSession session=request.getSession();
if(session.getAttribute("user")!=null){
return "user/index";
}else {
try {
response.sendRedirect(request.getContextPath()+"/login.html");
} catch (IOException e) {
e.printStackTrace();
}
return "user/login";
}
}/**
* 执行登录操作
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(value="/login.action",method=RequestMethod.POST)
public void Login(HttpServletRequest request,HttpServletResponse response) throws IOException{
HttpSession session=request.getSession();
String userName=request.getParameter("loginName");
String userPassword=request.getParameter("loginPassword");
String yanzhengma=request.getParameter("yanzhengma");
String randNum=(String) request.getSession().getAttribute("random");
System.out.println("系统生成的验证码:"+randNum);
System.out.println("登陆界面传过来的验证码:"+yanzhengma);
//不区分大小写比较相等
if(!randNum.equalsIgnoreCase(yanzhengma)){
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("yanzhengmaError");
return;
}
User user=new User();
user.setLoginNumber(userName);
user.setLoginPassword(userPassword);
user=this.userServices.userLogin(user);
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
try {
if(user!=null){
session.setAttribute("user", user);
response.getWriter().print("true");
}else {
response.getWriter().print("false");
}
} catch (Exception e) {
}
}
}
第七步:service层
@Transactional
@Service("userService")
public class UserServicesImpl implements UserServices{
@Autowired
private UserDao userDao;
@Override
public User userLogin(User user) {
System.out.println("call service");
User user2=this.userDao.userLogin(user);
return user2;
}
}
第八步:dao层
(1)使用hql
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Autowired
private SessionFactory sessionFactory;
@Override
public User userLogin(User user) {
System.out.println("call dao");
User user2 = (User) this.sessionFactory
.getCurrentSession()
.createQuery(
"FROM User u where u.loginNumber=:loginName and u.loginPassword=:password")
.setString("loginName", user.getLoginNumber())
.setString("password", user.getLoginPassword()).uniqueResult();
return user2;
}
}
(2)使用原生sql
@Repository("deviceDao")
@SuppressWarnings("unchecked")
public class DeviceDaoImpl implements DeviceDao {
@Autowired
private SessionFactory sessionFactory;
/**
* 查询所有仓库设备
*
*/
@Override
public List<Device> getDevice() {
// isdelete = 2199-12-31 23:59:59,表示有效
String sql = "SELECT id AS deviceId,name,info,avaiNum,damageNum FROM lms_device WHERE isDelete = '2199-12-31 23:59:59'";
SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(sql);
query.addScalar("deviceId", StandardBasicTypes.INTEGER);
query.addScalar("name", StandardBasicTypes.STRING);
query.addScalar("info", StandardBasicTypes.STRING);
query.addScalar("avaiNum", StandardBasicTypes.INTEGER);
query.addScalar("damageNum", StandardBasicTypes.INTEGER);
query.setResultTransformer(Transformers.aliasToBean(Device.class));
return query.list();
}
}
最后补充:为了方便在控制台看见后台操作的结果,能够输出后台执行情况,再加一个文件log4j.properties
1 ##OFF->FATAL->ERROR->WARN->INFO->DEBUG->ALL
2 ##ERROR->WARN->INFO->DEBUG
3 # define a logger named CONSOLE
4 log4j.rootLogger=INFO, CONSOLE
5 # CONSOLE logger - console
6 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
7 # COSOLE Layout
8 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
9 # CONSOLE format Layout
10 log4j.appender.CONSOLE.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss,SSS} %c:(%F:%L) - %m%n
所有的配置文件就是下面这几个。
到这里,再写好jsp页面就可以运行一个springmvc的网站了。
第一次写博客,谨记。