`
cc19830923
  • 浏览: 34267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类

使用Spring 2.5 和 Hibernate 3.2 开发MVC Web程序(基于annotat

阅读更多
使用Spring 2.5 和 Hibernate 3.2 开发MVC Web程序(基于annotation特性)
使用Spring 2.5 和 Hibernate 3.2 开发MVC Web程序(基于annotation特性)



Spring 和 Hibernate 都支持annotation开发应用程序,无疑减少呢很多XML配置,使程序看起来更”干净”,下面我们以一个简单的例子来说明:

程序的开发环境:eclipse 3.2.2 + WTP + tomcat(推荐)

首先我们建一个动态的Web项目

修改WEB-INF/web.xml



<?xml version="1.0" encoding="UTF-8"?>

<web-app id="ascweb" version="2.4"

      xmlns="http://java.sun.com/xml/ns/j2ee"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

     

      <display-name>ascweb</display-name>



      <!--  载入Spring配置文件 -->

      <context-param>

           <param-name>contextConfigLocation</param-name>

           <param-value>/WEB-INF/applicationContext.xml</param-value><!-- 自动载入的spring配置 -->

      </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>*.do</url-pattern>

      </filter-mapping>

      <!-- Spring MVC 的Servlet -->

      <servlet>

           <servlet-name>ascweb</servlet-name>

           <servlet-class>

                 org.springframework.web.servlet.DispatcherServlet

           </servlet-class>

           <load-on-startup>1</load-on-startup>

      </servlet>



      <servlet-mapping>

           <servlet-name>ascweb</servlet-name>

           <url-pattern>*.do</url-pattern>

      </servlet-mapping>



      <welcome-file-list>

           <welcome-file>index.htm</welcome-file>

           <welcome-file>index.jsp</welcome-file>

           <welcome-file>index.do</welcome-file>

      </welcome-file-list>

</web-app>



建立好这个文件之后,我们在WEB-INF目录下面建一个ascweb-servlet.xml文件,其实这个文件的命名就是Web.xml中servlet-name的名字加-servlet.xml.其文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">



<beans>

<!-- 定义Spring MVC 的模板文件 -->

      <bean id="viewResolver"

      class="org.springframework.web.servlet.view.InternalResourceViewResolver">

           <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>     <!-- 支持JSTL -->

           <property name="prefix" value="WEB-INF/views/" />     <!-- 模板的路径 -->

           <property name="suffix" value=".jsp" />                 <!-- 模板文件的后缀-->

      </bean>



      <!-- 依赖注入到HelloController这个类 -->

      <bean id="helloController" class="com.asc.web.ctl.HelloController">

           <property name="viewName">  <!-- 设定viewName属性的值为hello -->

                 <value>hello</value>

           </property>

           <property name="userDao">     <!-- 设置属性userDao为Hibernate的Dao对象 -->

                 <ref bean="userDAOProxy" /> <!-- 注入一个bean(定义在Hibernate的配置文件里) -->

           </property>

      </bean>

</beans>



然后我们建立一个/WEB-INF/applicationContext.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"

      xsi:schemaLocation="http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

      <-- 数据源配置 -->

      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

           <property name="driverClassName">

                 <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>

            </property>

           <property name="url">

                 <value>jdbc:sqlserver://192.168.1.21:2433;DatabaseName=expert</value>

           </property>

           <property name="username">

                 <value>sa</value>

           </property>

           <property name="password">

                 <value>oilchem2006</value>

           </property>

      </bean>

     

<!-- hibernate3 session Bean-->

      <bean id="sessionFactory"

      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

           <property name="dataSource"> <!-- 注入数据源 -->

                 <ref local="dataSource" />

           </property>

           <property name="annotatedClasses">    <!-- 需要加载的Hibernate实体类(不需要hbm.xml了) -->

                 <list>

                      <value> com.asc.dao.User</value>

                 </list>

           </property>

           <property name="hibernateProperties">

                 <props>

                      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

                      <prop key="hibernate.show_sql">true</prop>

                 </props>

           </property>

      </bean>



      <!-- 事务管理 -->

      <bean id="transactionManager"

           class="org.springframework.orm.hibernate3.HibernateTransactionManager">

           <property name="sessionFactory">

                 <ref local="sessionFactory" />

           </property>

      </bean>



      <!-- UserDAO bean-->

      <bean id="userDAO" class=" com.asc.dao.UserDAO">

           <property name="sessionFactory">

                 <ref local="sessionFactory" />

           </property>

      </bean>



      <!-- 带事务处理的userDao 代理 -->

      <bean id="userDAOProxy"

      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

           <property name="transactionManager">

                 <ref bean="transactionManager" />

           </property>

           <property name="target">

                 <ref local="userDAO" />

           </property>

           <property name="transactionAttributes">

                 <props>

                      <prop key="insert*">PROPAGATION_REQUIRED</prop>

                      <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

                 </props>

           </property>

      </bean>

</beans>



然后我们开始写hibernate的代码,很简单

实体类User.java:

package com.asc.dao;

import javax.persistence.*;

import java.io.Serializable;



//指定表格的名称,注解方式

@SuppressWarnings("serial")

@Entity

@Table(name = "users2")

public class User implements Serializable {



      public Integer id;



      public String username;



      public String password;

     

//主键,注解方式

      @Id

      @GeneratedValue(strategy = GenerationType.AUTO)

      public Integer getId() {

           return id;

      }



      public void setId(Integer id) {

           this.id = id;

      }



      public String getPassword() {

           return password;

      }



      public void setPassword(String password) {

           this.password = password;

      }



      public String getUsername() {

           return username;

      }



      public void setUsername(String username) {

           this.username = username;

      }

}



然后我们新建一个接口IUserDAO:

package com.asc.dao;

import java.util.List;



public interface IUserDAO {



      public abstract void insertUser(User user);

      public abstract List<User> selectUser();



}



我们再建一个接口的实现UserDAO:

package com.asc.dao;

import java.util.List;



import org.springframework.orm.hibernate3.support.HibernateDaoSupport;





public class UserDAO extends HibernateDaoSupport implements IUserDAO{

      //插入数据

      public void insertUser(User user) {

           getHibernateTemplate().saveOrUpdate(user);

      }

     

//查询数据

      @SuppressWarnings("unchecked")

      public List<User> selectUser(){

           String sql="From User Order By id";

           List<User> findByNamedQuery = getHibernateTemplate().find(sql);

           return findByNamedQuery;

      }

}



现在我们的Hibernate部分就全部写好了.简单吧,发现什么了吗,没有讨厌的hbm.xml文件呢,那些配置写道User这个实体类里了,这个是Java 5之后才有的功能,叫annotation(相当于元数据).



现在我们开始写MVC层

建立一个文件:

package com.asc.web.ctl;



import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import com.asc.dao.IUserDAO;

import com.asc.dao.User;



//还是注解方式,不用继承任何类或者实现任何接口

@Controller

public class HelloController{

      private String viewName;

      private IUserDAO userDao;

     

//在ascweb-servlet.xml里配置的,该属性已经被注入userDAOProxy接口了

      public IUserDAO getUserDao() {

           return userDao;

      }

      public void setUserDao(IUserDAO userDao) {

           this.userDao = userDao;

      }

      public String getViewName() {

           return viewName;

      }

      public void setViewName(String viewName) {

           this.viewName = viewName;

      }

     

//注解其url映射

      @SuppressWarnings("unchecked")

      @RequestMapping("/hello.do")

      public String index(ModelMap map,HttpServletRequest request,HttpServletResponse response) {

           // map是用来设置View层数据的

           map.put("a1", "Spring真好用");

           request.getSession().setAttribute("a2", "测试Session");

List<User> list2 = userDao.selectUser();

           map.put("a3", list2);

           return this.viewName;  //该属性被注入值hello了,就是渲染视图hello.jsp

      }

}

现在我们可以做最后一部了.写View层,在WEB-INF/views里新建一个hello.jsp(还记得我们在配置Spring MVC层中配置view的路径是WEB-INF/views,后缀是jsp吗)

<%@ page language="java" contentType="text/html; charset=utf-8"

      pageEncoding="utf-8"%>

<%@ taglib prefix="c" uri="/WEB-INF/c.tld"%>

<!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>

测试: ${a1} ${a2}

<br />

<c:forEach var="list" items="${a3}">

      <c:out value="${list.id}"></c:out>

      <c:if test="${list.id % 2 == 0}">

           <a href="#" style="color:red;border:1px #ececec solid"><c:out

                 value="${list.username}"></c:out></a>

      </c:if>

      <c:if test="${list.id % 2 != 0}">

           <a href="#" style="color:green;border:1px #ececec solid"><c:out

                 value="${list.username}"></c:out></a>

      </c:if>

      <c:out value="${list.password}"></c:out>

      <br />

</c:forEach>

</body>

</html>

我们再加入log4j.properties到src目录,配置日志显示.方便调试Ok,运行一下.

效果不错吧.我们的目录结构:




需要可能用到的包:
分享到:
评论

相关推荐

    spring-core-5.0.9.RELEASE.jar

    spring-core-5.0.9.RELEASE.jar,官网下载,无修改。。。

    开发工具 jackson-annotations-2.8.6

    开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-...

    JsonFormat与@DateTimeFormat注解实例解析

    在Java开发中,处理时间日期格式化是一个常见的任务,特别是在数据的序列化和反序列化过程中。`JsonFormat` 和 `@DateTimeFormat` 这两个注解分别来自于Jackson库和Spring框架,它们都用于处理日期时间的格式化,但...

    polymerjs-dart:该软件包为Polymer.js 1.0提供了一个薄的Dart包装

    聚合物镖 该软件包为Polymer.js 1.0提供了一个薄包装。 语法非常接近polymer.js: ...该程序包可与web_components程序包一起使用,以在嵌入式dart脚本中创建自定义元素: &lt; dom-module id =" annotat

    serde_with-Rust的serde的自定义反序列化功能-Rust开发

    用于Rust的Serde的自定义反序列化功能此板条箱提供定制的De / Serialization辅助功能,与Serde的with-annotat结合使用用于Rust的Serde的自定义De / Serialization辅助功能。 。 Serde在serde#553跟踪类似助手的心愿...

    androidx-annotation-1.0.0.jar

    androidx-annotation-1.0.0.jar

    aws-amplify-vue:与AWS Amplify集成的Vue.js入门应用程序

    集成了VueJs入门应用程序。 请将问题提交到存储库。 入门 克隆项目并安装依赖项 $ git clone https://github.com/aws-samples/aws-amplify-vue.git $ cd aws-amplify-vue-sample $ npm install 将aws-exports文件...

    protein_bert

    临时指示此项目尚无适当的setup.py/pip安装,因此只需克隆该项目,然后将proteinbert子目录添加到您的python路径中即可(例如,通过修改PYTHONPATH virtualenv或使用sys.path.append)。 下载,了解如何在新的蛋白质...

    java8源码-MVPHulk:AndroidMVP快速集成方案(支持AndroidX)

    MVPHulk是RxJava+Rxlifecycle+Okhttp+Retrofit+Dagger2+MVP框架,结合BaseRecyclerViewAdapterHelper和SmartRefreshLayout封装可刷新加载的Base类并结合接口回掉做了三种接口交互方式, Butterknife用于View注入,...

    ling_in_loop

    ling_in_loop 关于该项目 此回购用于收集和评估项目“是否让语言学家参与循环会改善NLU数据收集”。 数据集 您可以在文件夹找到每个实验方案的。 子文件夹1_Baseline_protocol,2_Ling_on_side_protocol和3_...annotat

    allatori-annotations.jar

    allatori混淆用到的jar

    sentinel-annotation-aspectj-1.4.0.jar

    sentinel-annotation-aspectj-1.4.0.jar

    androidx-annotation-1.2.0.jar

    androidx-annotation-1.2.0.jar

    mongodb-http-logger

    用法 composer require doctrine/mongodb-odm-bundle doctrine_mongodb : connections : default : server : " mongodb://localhost:27017 " options : {} default_database : someDB ... type : annotat

    UAMCorpusToolInstaller33m

    text annotation,英语语料库软件,可统计此类,用于语料库语言学

    coco2017-panoptic-annotations-trainval2017.zip

    coco2017——panoptic_annotations_trainval2017.zip panoptic_annotations_trainval2017里面有两个标注文件: panoptic_train2017.json panoptic_val2017.json 这里面就是那92类的stuff,用于全景分割任务(不同...

Global site tag (gtag.js) - Google Analytics