基于 Spring的web系统开发(一)
框架,又是框架?java社区充斥了各种各样的框架。Struts、WebWork、Spring等等层出不穷,各个版块也为之吵的不亦乐乎。但究竟什么是框架?,框架能给我们的开发带来什么呢?我们说框架不简单是一门新的技术、也不简单是你炫耀的资本。框架的产生是为了解决某一个行业应用中带共性的问题。它是为了方便开发人员更有效的投入到业务逻辑的分析中而产生的。例如当你的系统中需要用到事务管理,数据库连接池的配置等这种与业务逻辑不相关技术实现时。你很可能会为每次的数据库操作都重复的书写数据库连接和事务管理。而框架就是集成了大部分与业务逻辑部相关的技术实现。使开发人员能全身心的去熟悉业务逻辑,不必理会那些繁琐、无意义的技术实现。这样就大大的提高了我们的工作效率。
所以我们看待一个新的框架时,是要看这个框架给我带来了什么样的便利,它提供那些技术实现。而非人云亦云。Spring作为一个全新的框架,它提供了基于MVC、DAO、AOP(这些名词不懂不要紧,在后面的章节中我会一一介绍)等的技术实现。是java世界中生命力极其旺盛的新一代框架。
在这本书中,我们会展示spring 在web开发方面的各项应用。在每介绍一个新的知识点时。会先给出一个最小化的例子程序。然后随着介绍的深入,逐步的完善这个例子。使大家在实际的开发应用中掌握知识。
Spring MVC 模块详解
1,Spring MVC 简介
不知道你有没有试过在一个杂乱无章的抽屉里寻找一把钥匙?在你寻找的过程你可以发现了一把钳子、一本书,甚至是一副扑克牌。但就是没找到你的钥匙。于是你就发誓下次一定要好好的整理下抽屉,最终你把抽屉分成了三块,一块放书本,一块放工具,另外一块就放日常用品了。
我们在开发的过程也可能遇到这种情况,在一个jsp页面中,既有上一个页面提交过来的数据、数据库连接的JDBC代码,还有如何处理这些数据的业务逻辑代码、大量的if else。甚至还有用来显示的html代码。当这个jsp页面一报错。完了,你的噩梦就来了。四处查找错误的原因,好不容易找到并修改后突然发现又引起了另一个错误。
上面的假设并不是不常见,相反很多程序员都遇到过这种问题。如何来有效解决这个问题呢。我们来引入Spring MVC这个抽屉管理大师,MVC实质上是一个分层的概念。它是Model ,View,Controller三个单词的简写。
Model就是模块的意思,是业务逻辑层面。例如根据用户输入的条件查询了数据库并返回了一 个结果集。
View就是视图的意思,是表示层面。例如显示由Model层返回的结果集。
Controller就是控制的意思,是控制层面。例如控制Model层中的查询动作时候什么发生,以及发生后执行什么操作、和返回什么页面等。
所以MVC也相当于是对“系统”这个抽屉的分块,这样利于我们代码的书写以及后期的维护。
2,例子程序
下面我们来看下面这个基于Spring MVC的例子程序。
(1), 程序的目录结构图如下:
lib目录没有展开,里面是spring框架的jar包。请拷贝spring框架下面的如下jar包到lib目录:
aopalliance.jar、commons-beanutils.jar 、commons-logging.jar、spring.jar、 standard.jar
实际上WEB-INF下还有个classes目录,它是用来存放编译后的java文件的。我们这里给出了与其对应src目录,src目录存放里面是java的源文件。src里面的源文件编译后会存放在classes目录下对应的子目录。classes的目录如下图:
(2),程序中各文件的源代码如下:
LoginController.java |
package com.framework.controller;
import org.springframework.web.servlet.mvc.AbstractController; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
/** * Created by IntelliJ IDEA. * User: 邓亮 * Date: 2005-9-2 * Time: 15:18:53 * To change this template use File | Settings | File Templates. */ public class LoginController extends AbstractController { protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //得到request对象。代码暂略 //调用相关的service操作来处理业务逻辑。代码暂略 return new ModelAndView("success");//定义操作完成后的返回页面。 } } |
applicationContext.xml |
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<!--启动加载异常处理的类,用于监听各模块中触发的异常,并定义当有异常发生时,全部返回到error页面--> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"> <value>error</value> </property> </bean>
<!--定义页面的前缀和后缀,如返回的页面路径为error时,那么完整的路径就为/WEB-INF/jsp/error.jsp--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
|
login-config.xml |
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>
<!--定义请求动作到控制器的映射,如loginInit.login这个请求动作就映射到id为login的bean(controller)来处理--> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="loginInit.login">login</prop> </props> </property> </bean>
<!--定义处理请求动作的控制器(controller),id与上面定义的名称相同--> <bean id="login" class="com.framework.controller.LoginController"> </bean> </beans> |
success.jsp |
<html> <head><title>Spring In Web</title></head> <body> 恭喜你. 如果你能看到这个页面, 证明spring MVC模块已经配置成功 </body> </html> |
web.xml |
<?xml version="1.0" encoding="GBK"?>
<web-app 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" >
<!--加载applicationContext.xml文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param>
<!--加载applicationContext.xml文件所需要用到的监听--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!--配置名为login的servlet,该servlet的作用是分发不同浏览器请求到对应的controller(控制器), 分发的原则在login-config.xml文件里面定义 --> <servlet> <servlet-name>login</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/login-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<!--定义所有以login为后缀名的请求,将转到名为login的servlet来处理--> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>*.login</url-pattern> </servlet-mapping>
<!--定义站点的入口页面--> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
index.jsp |
<%@ page contentType="text/html;charset=GBK"%> <html> <head><title>Simple jsp page</title></head> <body> <form action="loginInit.login" method="post"> <table> <tr> <td> 如果你能看到本页面,<br> 证明你的Tomcat服务器配置成功,<br> 请点击下面的提交按钮来测试Spring MVC<br> <input type="submit" value="提交"/> </td> </tr> </table> </form> </body> </html> |
最后在Tomcat的/conf/Catalina/localhost目录下新建一个名为ROOT.xml的文件。
<?xml version='1.0' encoding='utf-8'?> <Context displayName="web" docBase="D:/MyCase/web" path="" reloadable="true" workDir="D:/ MyCase /work"> </Context> |
启动tomcat,在浏览器中输入http://localhost:8080
好了,程序就介绍到这里,下一篇文章我们将讲解每个文件的意义及内在的联系