mvc 架构

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 60 Stories :: 5 Comments :: 0 Trackbacks
posted on 2007-09-12 13:57 e全 阅读(3090) 评论(0)  编辑  收藏

[1]

1. 前言

此文档讲述的内容适合于对 Spring MVC 和数据持久层 ORM 概念有一定基础的开发者,着重于讲述基于 Spring 框架基础之上进行 Java 开发的其中一种技术解决方案,而不是讲述相关技术的原理,想要了解技术原理内容请参考相关文档资料。
 
  现在,网络上流传的Spring+Struts+Hibernate用得非常火,几乎成为很多对技术痴迷的人的技术架构标准,可是在我看来,也许是因为项目都不算大,人力也不够多,这个技术架构太复杂了。从Spring本身来讲,从MVC到数据操作,都可以不需要其他附加组件即可实现,并且结构清晰,使用简单,功能还更加强大,本文讲述的重点就是单独使用Spring来建立一个简易的开发框架。
 
  首先说,为什么选择Spring呢?大概在2003年的时候,Struts已经开始流行了,但是在学习Struts的时候感觉这个技术框架比原始的JSP+JavaBean的方式复杂了很多,后来2004年做新项目时在论坛上看到推荐Spring,下载一试,上手非常的容易,结构也很清晰,支持的功能也非常多,所以决定用它了(其实那时候对于依赖注入和AOP代理还不甚了解,也很少用到接口)。

  在
2001-2003年的时候都是自己封装了JavaBean做为公共模块来访问数据库的,后来ORM兴起了,先是看了Hibernate的,3.0版还没用出,还不支持存储过程,因为那时候也做Delphi相关开发,用惯了SQL语句,始终觉得HQL这样的东东增加了开发的复杂度和不可控制性,原生的复杂SQL语句无法使用,不喜欢。后来看到了iBATIS,经过试用,正是我所需要的,SQL语句配置简单,基本不会破坏SQL语句的结构,这样将SQL语句Copy到外部数据库工具中进行调试也非常的方便,加上SQL语句可以使用很多的特定数据库的函数,执行效率和简洁性也非常好,修改了SQL又不需要重新编译程序。

  
有网友说Hibernate支持多个数据库移值啊,我认为这个就不仅仅是SQL语句的问题了,还有很多其他方面的因素,大多数项目都可以不用考虑。又有网友说Hibernate对于数据库结构修改的影响比较小,这种情况影响的也不仅仅是几句代码的问题,涉及到界面表现、业务流程等很多重要方面,相对说来修改代码倒是小Case了。


  说完了上面的
ORM 组件,再说说 JDBC Spring JdbcTemplate 将我们常用的 JDBC 流程封装起来,使用非常简单,一般执行的 SQL 就是一句话,构造 SQL 随着业务的复杂而复杂,并且也支持 PrepareStatement 的执行模式避免 SQL 注入漏洞发生,同样具备完整的数据操作功能如查询、更新、存储过程、异常捕捉等等,经过几年的使用比较,我认为轻型的项目使用 JdbcTemplate 是非常不错的选择。

  由于能力所限,其中细节如有欠缺之处,请多多批评指正。

2. 参考资料

²   Spring 官方网站: http://www.springframework.org/

²   Spring 2.0 中文参考手册: http://spring.jactiongroup.net/

²   Apache Jakarta 官方网站: http://jakarta.apache.org/

²   JSTL 官方网站: http://java.sun.com/products/jsp/jstl/

²   Intellij IDEA 官方网站: http://www.jetbrains.com/

3. 架构概览

MVC 层在 Spring AbstractController 类基础上进行了继承和重构,使整个框架仅使用单一的公共控制器,数据操作采用 Spring JdbcTemplate ,在逻辑层中直接集成了 Spring Jdbc 能力,可直接操作数据,表现层 Jstl ,除此之外,未定义任何的表单对象、数据库表映射对象和其他 ORM 的配置文件,在保留对关键功能的集成度的基础上技术入门度极低,重点关注业务功能和优化 SQL 语句

请求处理流传如图所示:



1)      用户访问 http://www.fyyk.com/a.do

2)      Web 应用服务器(如 tomcat )解析扩展名为 *.do 的请求,通过 Spring 分发器 org.springframework.web.servlet.DispatcherServlet 读取 servlet-do.xml 中的配置,将请求转发给公共控制器类 LogicController.java

3)      公共控制器类 LogicController.java 根据 servlet-do.xml 文件中的配置信息调用 DoLogicImpl.java 类中相对应名称的方法;

4)      DoLogicImpl.java 类中的方法在处理完成业务逻辑后,将数据内容 ModelAndView 返回给公共控制器类 LogicController.java

5)      公共控制器类 LogicController.java 处理 ModelAndView 信息,执行 b.jsp 将结果数据显示出来;

3.1. 控制器 Controller




  控制器类配置在

servlet-xxx.xml 文件中,封装后的 Controller 特点如下:

1)    继承 AbstractController 类,便于调用应用环境的 Web 特性;

2)   只用控制器做请求的转发,业务实现全部在逻辑层;

3)      采用反映射机制( reflect ),运行期调用逻辑类中的方法,而请求 URI 、逻辑类和方法名之间的对应关系只需要在 servlet-xxx.xml 中配置,这样,控制器实现就只有唯一的一个类文件;

3.2. 逻辑层 Logic




  逻辑层类在

applicationContext-xxx.xml 文件配置 Bean 定义中,主要实现两项功能:一是处理业务逻辑,二是操作数据库;

逻辑层类首先需要定义一个接口类,统一以 xxxLogic.java 命名,实现类命名为 xxxLogicImpl.java ,并继承 JdbcDaoSupport 类,这样逻辑类便具有了数据库访问能力。

逻辑类的方法如果被公共控制器类 LogicController.java 的反映射机制直接调用,则其接口类需要继承空的公共接口类 BasicLogic ,定义方法时参数和返回值是固定的,如果是被其他逻辑类调用则不需要。

public ModelAndView initLogin(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext);

控制器层直接将请求的 request response servletContext 全部传递过来交由逻辑层自由控制,对于 request 中的表单数据,未采用 SimpleFormController 的模式定义表单对象,建议手工获取,从代码量本身来将并不复杂,反而更加灵活。在业务处理完成后,必须构造一个 ModelAndView 对象,作为方法返回值回传给控制器。

范例代码如下:

public class AdminLogicImpl extends JdbcDaoSupport implements AdminLogic

{

 

public ModelAndView insertUser(HttpServletRequest request, HttpServletResponse response,

    ServletContext servletContext) throws DataAccessException

    {

         String userId = request.getParameter("userId");

         String userName = request.getParameter("userName");

         int age = Integer.parseInt(request.getParameter("age"));

         double weight = Double.parseDouble(request.getParameter("weight"));

 

         String sqlStr = "insert into testuser (userId,username,age,weight,updatetime) values (?,?,?,?,?)";

         Object[] object = new Object[]{userId, userName, age, weight, new Date()};

         getJdbcTemplate().update(sqlStr, object);

 

        Map<String, Object> model = new HashMap<String, Object>();

         model.put("msg", " 插入用户成功! ");

        model.put("url", "pageForm.user");

         String view = "admin/message.jsp";

         return new ModelAndView(view, model);

    }

}

3.3. 表现层 Jstl

表现层采用 Jstl taglib 1.2 ,在 *.jsp 页面中加入 taglib 引用即可使用 Jstl 标签的大部分功能了,标签的具体使用方法请参考相关文档。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>


4. 开发准备

4.1. 开发工具

Ø  Java 编辑器 Intellij IDEA 6.0.5 Eclipse WTP 3.2

Ø  JDK5.0 Update 11

Ø  Web 服务器 Tomcat 5.5.20

Ø  数据库 Oracle10g

4.2. 支撑库文件

spring.jar

spring 2.0.3

jstl.jar

standard.jar

Jstl 1.2

commons-io-1.3.1.jar

commons-fileupload-1.2.jar

文件上传组件

commons-logging-1.1.jar

log4j-1.2.14.jar

日志组件

mail.jar

activation.jar

邮件组件

quartz-1.5.2.jar

时序调度组件

aspectjweaver.jar

AOP 组件

commons-lang-2.3.jar

Apache 公共包

commons-codec-1.3.jar

commons-collections-3.2.jar

commons-httpclient-3.0.1.jar

Httpclient 组件

4.3. 系统目录结构

s004.gif

 

 

/

工程根目录

/lib

工程所用的库文件目录

/src

源代码目录

/webapp

站点根目录

/webapp/css

样式表目录

/webapp/images

图片目录

/webapp/js

Js 脚本目录

/webapp/WEB-INF

web.xml 等配置文件所在目录

/webapp/WEB-INF/classes

Class 所在目录

/webapp/WEB-INF/jsp

Jsp 文件存放目录

/webapp/WEB-INF/lib

jar 包目录

/webapp/WEB-INF/logs

程序日志目录

/webapp/WEB-INF/temp

临时文件保存目录

4.4. 配置开发环境

4.4.1 设置字符集

程序文件全部为 UTF-8 字符集,使用开发工具建立工程时需要修改工程的默认字符集。


  在
IDEA 中通过 Ctrl+Alt+S 快捷键打开设置窗口,选择 IDE Settings 下面的 General 打开通用设置窗口,修改 File Encoding 下面的 Default encoding UTF-8 ,同时修改 Properties Files 下面的 Default encoding UTF-8


 在
Eclipse 中点击菜单 Window-Preferences 打开参数设置窗口,选择左侧树形节点 General-Workspace ,修改 Text File Encoding UTF-8


  如果需要使用已经存在的源文件,使用
IDEA 建立同名新文件,然后 copy 原始文件内容到新文件中,注意不要直接使用源文件,可能会产生乱码问题。

4.4.2 配置数据库驱动

  由于数据库连接池组件包使用的是 Tomcat 自带,所以数据库驱动程序包需要放在 Tomcat 可以访问的位置, Oracle 驱动 ojdbc14.jar 文件必须 Copy tomcat/common/lib 这样的目录下,而不能放在开发工具工程 lib 目录下。

5. web.xml 配置

5.1. 基本配置

   web.xml 采用 servlet2.4 规范,默认配置了会话过期时间和网站首页文件。

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

<web-app id="WebApp_ID" 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">

 

    <!-- 会话的时间 -->

    <session-config>

              <session-timeout>30</session-timeout>

       </session-config>

 

       <!-- 欢迎页面 -->

       <welcome-file-list>

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

       </welcome-file-list>

      

</web-app>

5.2. 加载 spring 监听

   在 web.xml 文件中加入如下配置:

<!-- 设置环境变量,将 web 应用根目录存储到环境变量中 -->

<context-param>

    <param-name>webAppRootKey</param-name>

    <param-value>webapp.root</param-value>

</context-param> 

 

<!-- 设置环境变量指定 applicationContext.xml 配置文件 -->

<context-param>

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

    <param-value>

        /WEB-INF/applicationContext.xml

        /WEB-INF/applicationContext-admin.xml

        /WEB-INF/applicationContext-quartz.xml

    </param-value>

</context-param>   

 

<!-- 设置 context 的监听,启动时加载 applicationContext.xml 文件,初始化 applicationContext 实例 -->

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

5.3. Log4j 日志

   首先,在 web.xml 文件中加入如下配置:

<!-- 设置环境变量指定 log4j 的配置文件 -->

<context-param>

    <param-name>log4jConfigLocation</param-name>

    <param-value>/WEB-INF/log4j.properties</param-value>

</context-param>

 

<!-- 设置 log4j 的监听,使日志组件能够使用,调用 log4jConfigLocation 中设置的环境变量 -->

<listener>

    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>

</listener>

 log4j.properties 文件放在 /WEB-INF/ 目录下, 文件内容如下例,其中根日志级别为 warn ,而在包 cn.idtag 中的类的日志级别为 info

# 定义根日志的级别和输出路径 fatal, error, warn, info, debug

log4j.rootCategory=warn, stdout, logfile

 

# 在包 cn.idtag 中的类的日志级别

log4j.logger.cn.idtag=info

 

# 日志输出参数

#%c: 日志信息所在类名

#%d: 日志信息产生时间

#%p: 日志信息级别

#%m: 产生的日志具体信息

#%n: 输出日志信息换行

log4j.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c%n%m%n%n

 

# 控制台输出

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=${log4j.ConversionPattern}

 

# 日志文件输出

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/log.txt

log4j.appender.logfile.Append = true

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=${log4j.ConversionPattern}

5.4. 解决中文乱码

 在 web.xml 文件中加入如下配置,可以解决表单提交的编码,不需要在每个 *.jsp *.htm 等页面上编写代码“ <%@ page contentType="text/html; charset=gbk" language="java"%> ”了,并且为浏览器端设置的“ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ”代码也不需要写了,浏览器会自动识别,注意建立文件时一定要使用 UTF-8 字符集。

<!-- 设置字符串过滤器,解决表单 Post 提交中的乱码问题 -->

<filter>

    <filter-name>characterEncoding</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>characterEncoding</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!-- 设置 jsp,htm,html 页面的字符集,是否使用标签,是否使用 jsp 脚本等,头尾载入页面等 -->

<jsp-config>

    <jsp-property-group>

        <description> 指定 JSP 文件的配置属性 </description>

        <display-name>jspConfiguration</display-name>

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

        <el-ignored>false</el-ignored>

        <page-encoding>utf-8</page-encoding>

        <scripting-invalid>false</scripting-invalid>

        <include-prelude></include-prelude>

        <include-coda></include-coda>

    </jsp-property-group>

 

    <jsp-property-group>

        <description> 指定 htm 文件的配置属性 </description>

        <display-name>jspConfiguration</display-name>

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

        <el-ignored>false</el-ignored>

        <page-encoding>utf-8</page-encoding>

        <scripting-invalid>false</scripting-invalid>

        <include-prelude></include-prelude>

        <include-coda></include-coda>

    </jsp-property-group>

 

    <jsp-property-group>

        <description> 指定 html 文件的配置属性 </description>

        <display-name>jspConfiguration</display-name>

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

        <el-ignored>false</el-ignored>

        <page-encoding>utf-8</page-encoding>

        <scripting-invalid>false</scripting-invalid>

        <include-prelude></include-prelude>

        <include-coda></include-coda>

    </jsp-property-group>

 

</jsp-config>

 如果应用服务器是 Tomcat ,编辑 Tomcat 根目录下的“ /conf/server.xml ”文件,找到 Connector 配置部分,在配置结尾加入“ URIEncoding="utf-8" ”:

<Connector port="8080" maxThreads="150" …… disableUploadTimeout="true"/>

改为:

<Connector port="8080" maxThreads="150" …… disableUploadTimeout="true" URIEncoding="UTF-8"/>

 可解决系统内部 GET 方法传递中文字符参数的乱码问题,但是在外部 URL 请求中参数值带有中文的,必须使用 URLEncode 编码。

5.5. 配置 servlet

 在 web.xml 文件中配置 servlet 请求路径和实现类:

<servlet>

    <servlet-name>sendSms</servlet-name>

    <servlet-class>cn.idtag.test.servlet.SendSmsServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>sendSms</servlet-name>

    <url-pattern>/servlet/sendsms</url-pattern>

</servlet-mapping>

 而 SendSmsServlet.java 文件需要继承 HttpServlet 类,如果 response 要输出内容并包含非英文字符,要设置输出的字符集为 UTF-8

package cn.idtag.test.servlet;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServlet;

import javax.servlet.ServletException;

import java.io.IOException;

 

public class SendSmsServlet extends HttpServlet

{

    public void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException

{

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "utf-8"));

        try

        {

        //do something…

        } finally

        {

            out.close();

        }

    }

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException

    {

        doGet(request, response);

    }

}


6. Spring 配置

6.1. 视图配置

配置 Spring 环境公共设置的 applicationContext.xml 文件放在 /WEB-INF/ 目录下, 首先定义视图类型为 Jstl ,并约定 JSP 文件的默认保存路径,配置异常捕获处理 Bean ,当系统发生异常时,自动重新定向到 error.jsp 文件显示异常内容。

<?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:aop="http://www.springframework.org/schema/aop"

       xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

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

 

    <!-- 返回的视图资源的前缀和后缀,基于 Jstl 模板 -->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

        <property name="prefix" value="/WEB-INF/jsp/"/>

    </bean>

 

    <!-- 启动加载异常处理的类,用于监听各模块中触发的异常 -->

    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

        <property name="defaultErrorView" value="error.jsp"/>

    </bean>

</beans>

6.2. 数据库连接

applicationContext.xml 文件中加入下面配置,首先加载数据库配置文件 jdbc.properties ,然后配置数据源,此处使用的是 TOMCAT 自带的数据库连接池实现,其实就是 Apache DBCP 连接池的重新封装。

<!-- 加载 properties 配置文件 -->

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="locations">

        <list>

            <value>/WEB-INF/jdbc.properties</value>

        </list>

    </property>

</bean>

 

<!-- 数据源 -->

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

    <property name="driverClassName" value="${jdbc.driverClassName}"/>

    <property name="url" value="${jdbc.url}"/>

    <property name="username" value="${jdbc.username}"/>

    <property name="password" value="${jdbc.password}"/>

</bean>

  jdbc.properties 文件在 /WEB-INF/ 目录下:

jdbc.driverClassName=oracle.jdbc.OracleDriver

jdbc.url=jdbc:oracle:thin:@localhost:1521:oradb

jdbc.username=demo

jdbc.password=123456

6.3. 数据库事务

applicationContext.xml 文件中加入下面配置,数据库事务管理,采用的是 AOP 代理,对所有文件名称以 Logic 结尾的接口类进行事务代理。在接口类中,方法名称以 insert update 等开头的采用事务管理,设置 Propagation REQUIRED 表示支持当前事务,如果当前没有事务,就新建一个事务;而其他的方法以 * 表示,设置 Propagation SUPPORTS 表示支持当前事务,如果当前没有事务就以非事务方式执行, read-Only true 表示对应事务被最优化为只读事务。

<!-- 事务管理器 -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

</bean>

 

<!--aop 代理,对所有以 Logic 为后缀文件名的接口类进行代理 -->

<aop:config>

    <aop:advisor pointcut="execution(* *..*Logic.*(..))" advice-ref="txAdvice"/>

</aop:config>

 

<!-- 数据库事务代理,对类中的指定前缀的方法进行事务控制 -->

<tx:advice id="txAdvice">

    <tx:attributes>

        <tx:method name="insert*" propagation="REQUIRED"/>

        <tx:method name="update*" propagation="REQUIRED"/>

        <tx:method name="delete*" propagation="REQUIRED"/>

        <tx:method name="upload*" propagation="REQUIRED"/>

        <tx:method name="*" propagation="SUPPORTS" read-only="true"/>

    </tx:attributes>

</tx:advice>


pointcut 的语法说明如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

Ø  除了返回类型模式、名字模式和参数模式以外,所有的部分都是可选的;

Ø  返回类型模式( ret-type-pattern )决定了方法的返回类型必须依次匹配一个连接点,返回类型模式 * 代表了匹配任意的返回类型;

Ø  名字模式( name-pattern )匹配的是方法名,可以使用 * 通配符作为所有或者部分命名模式;

Ø  参数模式( param-pattern )稍微有点复杂, () 匹配了一个不接受任何参数的方法,而 (..) 匹配了一个接受任意数量参数的方法(零或者更多),模式 (*) 匹配了一个接受一个任何类型的参数的方法,模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是 String 类型。

 

下面给出一些常见切入点表达式的例子。

Ø  任意公共方法的执行: execution(public * *(..))

Ø  任何一个以“ set ”开始的方法的执行: execution(* set*(..))

Ø  AccountService 接口的任意方法的执行: execution(* com.xyz.service.AccountService.*(..))

Ø  定义在 service 包里的任意方法的执行: execution(* com.xyz.service.*.*(..))

Ø  定义在 service 包或者子包里的任意方法的执行: execution(* com.xyz.service..*.*(..))

 

表达式 execution(* *..BookManager.save(..)) 的解读:

Ø  第一颗 * 代表 ret-type-pattern 返回值可任意;

Ø  *..BookManager 代表任意 Pacakge 里的 BookManager 类,如果写成 com.xyz.service.* 则代表 com.xyz.service 下的任意类, com.xyz.service..* com.xyz.service 则代表 com.xyz.service 及其子 package 下的任意类;

Ø  save 代表 save 方法,也可以写 save* 代表 saveBook() 等方法;

Ø  (..) 匹配 0 个参数或者多个参数的,任意类型, (x,..) 第一个参数的类型必须是 X (x,,,s,..) 匹配至少 4 个参数,第一个参数必须是 x 类型,第二个和第三个参数可以任意,第四个必须是 s 类型。

6.4. 控制器配置

控制器的配置文件为 servlet-xxx.xml xxx URI 请求的扩展名,此文件可以在 web.xml 中配置,如果不配置, spring 默认查找的是 xxx-servlet.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">

 

    <import resource="applicationContext.xml"/>

 

    <bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

 

    <bean name="/mainpage.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">

        <property name="viewName" value="mainpage.jsp"/>

    </bean>

 

    <!-- 无拦截请求 -->

    <bean id="noInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

        <property name="mappings">

            <props>

                <prop key="login.do">doController</prop>

            </props>

        </property>

    </bean>

 

    <!-- 有拦截请求 -->

    <bean id="hasInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

        <property name="interceptors">

            <list>

                <ref bean="authInterceptor"/>

            </list>

        </property>

        <property name="mappings">

            <props>

                <prop key="enter.do">doController</prop>

                <prop key="logout.do">doController</prop>

            </props>

        </property>

    </bean>

 

    <!-- 请求与方法映射控制器 -->

    <bean id="doController" class="com.fyyk.core.LogicController">

        <property name="logicClass" ref="doLogic"/>

        <property name="uriMethodMapping">

            <props>

                <prop key="login">login</prop>

                <prop key="enter">enter</prop>

                <prop key="logout">logout</prop>

            </props>

        </property>

    </bean>

 

</beans>

6.5. 逻辑类配置

逻辑类的配置文件为 applicationContext-xxx.xml ,此文件可以在 web.xml 中配置,如 applicationContext-admin.xml 文件,也可以配置合并在 applicationContext.xml 中:

    <bean id="authInterceptor" class="com.fyyk.interceptor.AuthInterceptor">

        <property name="noLoginRedirect" value="/WEB-INF/jsp/noLogin.jsp"/>

    </bean>

 

    <bean id="doLogic" class="com.fyyk.logic.DoLogicImpl">

        <property name="dataSource" ref="dataSource"/>

    </bean>

7. 开发工作要做什么

一般说来,完成一个操作流程的全部开发需要完成以下工作:


1.  
配置 servlet-xxx.xml 文件,加入 URI 请求的控制器 Bean 、逻辑类及方法;


2.  
配置 applicaionContext-xxx.xml 文件,加入响应 URI 请求的逻辑类 Bean 定义;


3.  
建立逻辑类文件接口类文件,加入响应 URI 请求的方法,并实现该类和方法,在方法体中完成具体的业务代码,如果需要操作数据库,则实现类需要继承 JdbcDaoSupport 类;


4.  
建立 .jsp 文件,输出请求结果;



  点此下载演示代码


  接下来会有一些应用范例程序介绍给大家。


只有注册用户登录后才能发表评论。


网站导航: