简单的Spring+SpringMVC+Hibernate项目

 

做了一个简单的论坛显示项目,用户输入用户名密码登录后,即可看到论坛文章列表和摘要,项目比较简单,帮助自己尽快熟悉用到的知识点

目录

项目设计

项目开发

步骤1:选择maven构建项目

步骤2:在MySQL中创建2个表t_user、t_post

步骤3:开发PO层 、DAO层

步骤4:开发service层

步骤5:开发Web层controller

步骤6:编写JSP文件

步骤7:运行项目

遇到的问题


项目设计

功能点用户登录、登录后显示论坛帖子列表
框架选择

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(),无法将数据写入数据库

             解决方案:同上待更新

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值