做了一个简单的论坛显示项目,用户输入用户名密码登录后,即可看到论坛文章列表和摘要,项目比较简单,帮助自己尽快熟悉用到的知识点
目录
项目设计
功能点 | 用户登录、登录后显示论坛帖子列表 |
框架选择 | pring+SpringMV+Hibernate+MySQL+JUnit 采用Maven构建项目 |
类和所属层次 | PO层:BasePo,Post,User DAO层:BaseDao、PostDao、UserDao Service层:PostService、UserService Web层:PostController、UserController |
数据库设计 | t_post(id,post_name,content) t_user(id,name,password) |
项目开发
开发过程参考了《精通Spring_4.x_企业应用开发实战》
步骤1:选择maven构建项目
(最开始尝试不用maven,直接构建JavaWeb项目,后来发现依赖的东西太多,要不断地拷贝过来,实在是太浪费时间了,所以改用maven构建,简化了开发)
构建好的项目结构如下图
然后在pom.xml中加入依赖的库,这里我把最终的pom.xml列出来了,但是开发过程中我是先加了Spring相关的和Jetty,保证能运行一个最简单的页面,后面开发到需要的时候再添加的其他
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>${mockito.version}</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-core</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-testng</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-spring</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-orm</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-database</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-dbmaintainer</artifactId>
<version>${unitils.version}</version>
</dependency>
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-dbunit</artifactId>
<version>${unitils.version}</version>
<exclusions>
<exclusion>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- aspectj依赖(spring依赖) -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>${aopalliance.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.6.0.GA</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>com.opera</groupId>
<artifactId>operadriver</artifactId>
<version>0.8.1</version>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>${dbunit.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-htmlunit-driver</artifactId>
<version>${selenium.version}</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>${hamcrest.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<forkMode>once</forkMode>
<threadCount>10</threadCount>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
<!-- jetty插件 -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>80</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<contextPath>/simpleforum</contextPath>
<scanIntervalSeconds>0</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<file.encoding>UTF-8</file.encoding>
<spring.version>4.2.2.RELEASE</spring.version>
<slf4j.version>1.7.5</slf4j.version>
<aspectj.version>1.8.1</aspectj.version>
<aopalliance.version>1.0</aopalliance.version>
<mysql.version>5.1.29</mysql.version>
<servlet.version>3.0-alpha-1</servlet.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<jetty.version>8.1.8.v20121106</jetty.version>
<aspectjweaver.version>1.6.8</aspectjweaver.version>
<hibernate.version>4.2.0.Final</hibernate.version>
<mockito.version>1.10.19</mockito.version>
<unitils.version>3.4.2</unitils.version>
<selenium.version>2.41.0</selenium.version>
<dbunit.version>2.5.1</dbunit.version>
<hamcrest.version>1.3</hamcrest.version>
</properties>
</project>
在main目录下,新建webapp目录,在webapp目录下创建WEB-INF目录,在WEB-INF目录下创建web.xml,web.xml里面不配置任何内容(一开始没建web.xml直接运行就报错了)
在webapp目录下放一个最简单的打印hello的index.jsp,然后maven运行项目
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
hello
</body>
</html>
在浏览器上就能访问了
步骤2:在MySQL中创建2个表t_user、t_post
为了简化逻辑,2张表没有关联
步骤3:开发PO层 、DAO层
PO层和DAO层,都有1个基类,然后user和post两个继承基类
PO层:
BasePO.java、User.java、Post.java
package com.rmc.po;
import org.apache.commons.lang.builder.ToStringBuilder;
import java.io.Serializable;
public class BasePO implements Serializable {
public String toString(){
return ToStringBuilder.reflectionToString(this);
}
}
package com.rmc.po;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_user")
public class User extends BasePO {
@Id
@Column(name = "id")
private int userId;
@Id
@Column(name = "user_name")
private String userName;
@Id
@Column(name = "password")
private String passWord;
public int getUserId() {
return userId;
}
public String getPassword() {
return passWord;
}
public String getUserName() {
return userName;
}
public void setUserId(int userId) {
this.userId = userId;
}
public void setPassword(String passWord) {
this.passWord = passWord;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.rmc.po;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_post")
public class Post extends BasePO {
@Id
@Column(name = "id")
private int postId;
@Id
@Column(name = "post_name")
private String postName;
@Id
@Column(name = "content")
private String content;
public void setPostid(int id){
postId = id;
}
public int getPostid() {
return postId;
}
public void setPostName(String postName) {
this.postName = postName;
}
public String getPostName() {
return postName;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
DAO层:
BaseDao.java、UserDao.java、PostDao.java
package com.rmc.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateTemplate;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
public class BaseDao<T> {
private Class<T> entityClass;
private HibernateTemplate hibernateTemplate;
public BaseDao(){
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
entityClass = (Class)params[0];
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Autowired
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public T load(Serializable id){
return (T) getHibernateTemplate().load(entityClass,id);
}
/**
* 获取PO的所有对象
*
* @return
*/
public List<T> loadAll() {
return getHibernateTemplate().loadAll(entityClass);
}
public T get(Serializable id){
return (T) getHibernateTemplate().get(entityClass,id);
}
public void save(T entity){
getHibernateTemplate().save(entity);
}
public void delete(T entity){
getHibernateTemplate().delete(entity);
}
public void update(T entity){
getHibernateTemplate().update(entity);
}
public List find(String hql){
return this.getHibernateTemplate().find(hql);
}
public List find(String hql,Object... params){
return this.getHibernateTemplate().find(hql,params);
}
}
package com.rmc.dao;
import com.rmc.po.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDao extends BaseDao<User> {
private static final String GET_USER_BY_NAME = "from User u where u.userName = ?";
public User getUserByUserName(String userName){
List<User> users = (List<User>)getHibernateTemplate().find(GET_USER_BY_NAME,userName);
if(users.size()==0){
return null;
}else{
return users.get(0);
}
}
}
package com.rmc.dao;
import com.rmc.po.Post;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class PostDao extends BaseDao<Post> {
private static final String GET_POST_BY_NAME = "from Post p where p.post";
public Post getPostByName(String postName){
List<Post> posts = (List<Post>)getHibernateTemplate().find(GET_POST_BY_NAME,postName);
if(posts.size()==0){
return null;
}else{
return posts.get(0);
}
}
}
然后配置applicationContext.xml以及Hibernate.xml,在main/resource目录下创建applicationContext.xml,配置Dao层所需的自动扫描以及数据库
<?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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 扫描com.smart.dao包下所有标注@Repository的DAO组件 -->
<context:component-scan base-package="com.rmc.dao"/>
<!-- 引入定义JDBC连接的属性文件-->
<!--<context:property-placeholder location="classpath:jdbc.properties"/> -->
<!-- 定义一个数据源-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/simpleforum_post"
p:username="rmc"
p:password="rmc" />
<!-- 定义Hibernate的Session工厂-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan"><!-- 扫描基于JPA注解的PO类目录-->
<list>
<value>com.rmc.po</value>
</list>
</property>
<!--指定Hibernate的属性信息 -->
<property name="hibernateProperties">
<props>
<!--指定数据库的类型为MySQL-->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<!--在提供数据库操作里显示SQL 方便开发期的调试,在部署时应该将其设计为false -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
</props>
</property>
</bean>
<!--定义HibernateTemplate -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate4.HibernateTemplate"
p:sessionFactory-ref="sessionFactory" />
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
<tx:method name="create*" propagation="REQUIRED" read-only="false" />
<tx:method name="save*" propagation="REQUIRED" read-only="false" />
<tx:method name="reg*" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" propagation="REQUIRED" read-only="false" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* com.rmc.*.*(..)))" order="1"/>
</aop:config>
<!--服务层配置 -->
<!-- 扫描com.smart.service包下所有标注@Service的服务组件 -->
<context:component-scan base-package="com.rmc.service"/>
<!--事务管理-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<bean id="requestMappingHandlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
</beans>
在main/resource目录下依次创建目录com/rmc/po/hbm,以及两个映射PO的Hibernate配置文件User.hbm.xml、Post.hbm.xml
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.rmc.po.User" table="t_user" >
<id name="userId" column="id">
<generator class="identity" />
</id>
<property name="userName" column="user_name" />
<property name="passWord" column="password"/>
</class>
</hibernate-mapping>
Post.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.rmc.po.Post" table="t_post" discriminator-value="2">
<id name="postId" column="id">
<generator class="identity" />
</id>
<property name="postName" column="post_name" />
<property name="content" column="content" />
</class>
</hibernate-mapping>
步骤4:开发service层
UserService.java、PostService.java
package com.rmc.service;
import com.rmc.dao.UserDao;
import com.rmc.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public User getUserByUserName(String name){
return userDao.getUserByUserName(name);
}
}
package com.rmc.service;
import com.rmc.dao.PostDao;
import com.rmc.po.Post;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PostService {
private PostDao postDao;
@Autowired
public void setPostDao(PostDao postDao){
this.postDao = postDao;
}
public List<Post> getAllPosts(){
return postDao.loadAll();
}
}
步骤5:开发Web层controller
实现用户登录,登录后显示论坛列表
UserController.java
package com.rmc.web;
import com.rmc.po.User;
import com.rmc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@Controller
public class UserController {
private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
@RequestMapping("/index")
public ModelAndView login() {
ModelAndView view =new ModelAndView();
view.setViewName("forward:/login.jsp");
return view;
}
@RequestMapping("/login/doLogin")
public ModelAndView doLogin(HttpServletRequest request, User user){
User dbUser = userService.getUserByUserName(user.getUserName());
ModelAndView mav = new ModelAndView();
mav.setViewName("forward:/login.jsp");
if(dbUser == null){
mav.addObject("erromsg","用户名不存在");
}else if(!dbUser.getPassword().equals(user.getPassword())){
mav.addObject("errormsg","用户密码错误");
}else{
mav.setViewName("redirect:/Post.html");
}
return mav;
}
}
PostController.java
package com.rmc.web;
import com.rmc.po.Post;
import com.rmc.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
public class PostController {
private PostService postService;
@Autowired
public void setPostService(PostService postService){
this.postService = postService;
}
/**
* 列出所有的论坛模块
* @return
*/
@RequestMapping("/Post")
public ModelAndView listAllPost() {
ModelAndView view =new ModelAndView();
List<Post> posts = postService.getAllPosts();
view.addObject("posts", posts);
view.setViewName("/listAllPosts");
return view;
}
}
配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>simpleforum</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>simpleforum</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
</web-app>
配置servlet文件simpleforum-servlet.xml
<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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 自动扫描com.smart.web 包下的@Controller标注的类控制器类 -->
<context:component-scan base-package="com.rmc.web" />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<mvc:annotation-driven/>
<!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
</beans>
步骤6:编写JSP文件
webapp下的login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String context = request.getContextPath();
request.setAttribute("context",context);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
<c:if test="${!empty errorMsg}">
<div style="color:red">${errorMsg}</div>
</c:if>
<form action="${context}/login/doLogin.html" method="post">
<table border="1px">
<tr>
<td width="20%">用户名</td>
<td width="80%"><input type="text" name="userName"/></td>
</tr>
<tr>
<td width="20%">密码</td>
<td width="80%"><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="登录">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
webapp/WEB-INF/jsp/listAllPosts.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>论坛首页</title>
</head>
<body>
<table border="1px" width="100%">
<tr>
<td colspan="3" bgcolor="#EEEEEE">所有论坛版块</td>
</tr>
<tr>
<td width="20%">版块名称</td>
<td width="70%">版块简介</td>
</tr>
<c:forEach var="post" items="${posts}">
<tr>
<td>${post.postName}</td>
<td>${post.content}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
修改index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<script>
window.location.href=" <c:url value="/index.html"/>";
</script>
步骤7:运行项目
浏览器输入http://localhost/simpleforum
输入用户名和密码点击登录,显示论坛列表
至此这个简单项目初步完成,本来准备参考书上用Unitils测试,但是在使用@SpringApplicationContext,总是出现加载为空,后来改用JUnit测试Dao层可以成功,这部分后面研究好了再更新
遇到的问题
这里对调试过程中遇到的问题做下总结:
问题1:报错expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annot。
解决方案:web.xml漏配置applicationContext
问题2:Dao层报Bean注入失败:expected at least 1 bean which qualifies as autowire candidate for this dependency.
解决方案:在main/resource/目录下增加PO层的Hibernate配置文件
问题3:BaseDao 层报注入HibernateTemplate失败
解决方案:applicationContext.xml中增加HibernateTemplate的Bean定义
问题4:Unitls @SpringApplicationContext注解不起作用
解决方案:待后续研究好了再更新这部分
问题5:改用Junit后,发现HibernateTemplate.save(),无法将数据写入数据库
解决方案:同上待更新