现在我们要做个简单的基于servlet的MVC的模型,我们要有一个Product要从表单处获取。

MVC中的M是模型,V是视图,C是控制器。视图负责应用的展示,模型封装了数据和业务逻辑,控制器负责接收用户输入,改变模型以及调整视图是显示。

在现代框架中,servlet和filter都可以作为controller,也就是控制器。

MVC中的业务逻辑一般叫做action,每个HTTP请求发给控制器,请求中的URL标识出对应的action。action标识了一个操作。在数据库中添加一个product需要两个action:

1.显示一个添加产品的表单

2.保存表单信息到数据库

然后我们要通过url来告诉控制器执行相应的action    http://domain/appName/product_input   http://domain/appName/product_save

控制器回解析url并调用相应的action,然后将模型对象放在视图可以访问到的区域,最后利用RequestDispatcher来跳转视图。

先来看用servlet实现的mvc:

Product类

public class Product implements Serializable {
//实现了序列化接口,然后就可以安全地将数据保存在HttpSession中 private static final long serialVersionUID = 544546444654L;
private String name;
private String description;
private float price; public String getName() {
return name;
} public String getDescription() {
return descriptioin;
} public String getPrice() {
return price;
} public void setName(String name) {
this.name = name;
} public void setPrice(float price) {
this.price = price;
} public void setDescription(String description){
this.description = description;
}
}

ProductForm类(这里主要是考虑到校验等问题)

public class ProductForm {

    private String name;
private String description;
private float price; public String getName() {
return name;
} public String getDescription() {
return descriptioin;
} public String getPrice() {
return price;
} public void setName(String name) {
this.name = name;
} public void setPrice(float price) {
this.price = price;
} public void setDescription(String description){
this.description = description;
}
}

两个视图:ProductForm.jsp对应于输入表单操作,ProductDetials.jsp对应于保存表单操作。

自己写的Controller接口:

public interface Controller {
String handleRequest(HttpRequest req, HttpServletResponse resp);
}

InputProductController类

public class InputProductController implements Controller {
public String handleRequest(HttpRequest req, HttpServletResponse resp) {
return "WEB-INF/jsp/ProductForm.jsp";
}
}

SaveProductController类

public class InputProductController implements Controller {
public String handleRequest(HttpRequest req, HttpServletResponse resp) {
ProductFrom productFrom = new ProductFrom();
productFrom.setName(req.getParameter("name"));
productFrom.setPrice(req.getParameter("price"));
productFrom.setDescription(req.getParameter("description")); //create model
Product product = new Product();
product.setName(productFrom.getName());
product.setPrice(productFrom.getPrice());
product.setDescription(productFrom.getDescription()); requset.setAttribute("product",product);
return "WEB-INF/jsp/ProductDetails.jsp";
}
}

DispatcherServlet 分发器servlet:

public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 4654654L;
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {
process(req,resp);
} public void doPost(HttpServletRequest req, HttpServletResponse resp) throws Exception {
process(req,resp);
} public void process(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String url = request.getRequestURl();
int lastIndex = url.lastIndexOf("/");//就是找出最后一个/的所在位置
String action = url.subString.substring(lastIndex+1); String dispatcherUrl = null;
if(action.equals("product_input.action")) {
InputProductController controller = new InputProductController();
dispatchUrl = controller.handleRequest(req,resp);
} else if(action.equals("product_save.action") {
SaveProductController controller = new SaveProductController();
dispatchUrl = controller.handleRequest(req,resp);
}//解析url,根据不同的action实例化不同的controller //跳转视图
if(dispatcherUrl != null) {
RequestDispatcher rd = request.getRequestDispather(dispatchUrl);
rd.forward(req,resp);
}
} }

然后这里顺便提提校验器,就是在后台校验表单内容,一般框架都支持声明式验证和编程式验证两种,前者需要提供包含校验规则的xml文档或者属性文件,后者则需要通过编码进行用户输入校验。

这就是一个简单的MVC模型的应用。

SpringMVC:

现在我们来开始介绍Spring MVC,这里我们讲的是“传统开发风格的”SpringMVC,另一种方式将是基于注解的。

首先,用Spring MVC有什么好处呢?首先一点就是,我们可以不用去写Disapatcher servlet,SpringMVC框架已经带有了这个,不用额外开发。也就是说,SpringMVC里面自带了一个DisapatcherServlet,它可以:

  1.根据url调用相应的action

  2.实例化正确的控制器类

  3.根据请求参数来构造表单bean

  4.调用控制器对象的相应方法

  5.转发到一个视图

也就是说,只要我们把该配置的配置好,SpringMVC自带的这个servlet就会帮我们去完成这些工作。

另外SpringMVC还有几个特点,像    可以自动绑定用户输入,并正确地转换数据类型;可以校验用户输入,若校验不通过,则重定向回输入表单,输入校验是可选的,支持编程以及声明方式……

SpringMVC的DispatcherServlet:

  要用这个自带的分发器,我们要在部署描述符也就是web.xml中配置好它。

  

<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DisaptcherServlet</servlet-class>
<load-on-startup>1<load-on-startup/>
<!-- 这个是可选的,如果存在,则在应用程序启动的时候就会装载这个servlet并调用它的init方法,如果不存在这个方法,则在这个servlet的第一个请求的时候加载 --> </servlet> <servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

好了,完成了这一步之后,现在Tomcat就知道我在用这个servlet,但这个servlet是来自SpringMVC的,所以显然它要读取到Spring的配置信息。所以这个servlet在初始化的时候,会在WEB-INF下找一个配置文件,该文件的命名规则如下:

  servletName-servlet.xml

这个servletName就是部署描述符中的那个DisaptcherServlet的名称,比如现在我们上面这个的文件名就应该为:

  springmvc-servlet.xml

当然,如果你不想这个配置文件放在着这,也不想用这个名字,那么你可以在部署描述符中使用servlet定义的init-param元素,以便servlet可以加载到这个元素,元素里面有一个值为<param-name>contextConfigLocation<param-name/>的param-name的元素,它的值param-value元素则包含配置文件的路径。

<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DisaptcherServlet</servlet-class>
<load-on-startup>1<load-on-startup/>
<!-- 这个是可选的,如果存在,则在应用程序启动的时候就会装载这个servlet并调用它的init方法,如果不存在这个方法,则在这个servlet的第一个请求的时候加载 --> <init-param>
<param-name>contextConfigLocation<param-name/>
<param-value>xxx/xxx/xxx/yourName.xml<param-name/>
<init-param/>
</servlet> <servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

 

Controller:

传统的开发方法就是去实现org.springframework.web.servlet.mvc.Controller

这个接口开放了一个handleRequest方法

  ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse);

这个ModelAndView可以包含视图路径或则同时包含视图路径和数据模型

Controller接口的实现类只能处理一个单一的动作Action,而一个基于注解的控制器可以同时支持多个请求处理动作,并且无须实现任何接口。

先来看spring配置文件,这里我们直接放在规定的位置和规定的命名——springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean name="/product_input.action" class="xxx.xxx.InputProductController"/>
<bean name="/product_save.action" class="xxx.xxx.SaveProductController"/>
</beans>

两个controller:

public class InputProductController implements Controller {
//这个controller就是spring框架那个要实现的controller
private static final Log logger = LogFactory.getLog(InputProductController.class); public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
logger.info("InputProductController caller");
return new ModelAndView("/WEB-INF/jsp/ProductForm.jsp");
}
}
public class SaveProductController implements Controller {
//这个controller就是spring框架那个要实现的controller
private static final Log logger = LogFactory.getLog(SaveProductController.class); public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
logger.info("SaveProductController caller"); ProductFrom productFrom = new ProductFrom();
productFrom.setName(req.getParameter("name"));
productFrom.setPrice(req.getParameter("price"));
productFrom.setDescription(req.getParameter("description")); //create model
Product product = new Product();
product.setName(productFrom.getName());
product.setPrice(productFrom.getPrice());
product.setDescription(productFrom.getDescription()); return new ModelAndView("/WEB-INF/jsp/ProductDetails.jsp","product",product);
}  
}

InputProductController的handelRequest只是返回一个包含视图的ModelAndView,

SaveProductController的handelRequest方法返回的ModelAndView包括了视图的路径、模型的名称及模型,该模型将提供给目标视图,用于展示。

ProductFrom.jsp中的form的action:

  action="product_save.action"

ProductDetials.jsp中

  Product Name: ${product.name} <br>

  Description: ${product.description}<br>

  Price: ${product.price}

  可以直接用EL表达式来访问传过来的product模型

SpringMVC的View Resolver:

SpringMVC的视图解析器负责解析视图,可以通过在Spring的配置文件来设置:

<bean id="viewResolver" class="org.springframewordk.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

上图的视图解析器设置了前缀和后缀两个属性,现在你只需要在ModelAndView里面返回"mainPage"就相当于

/WEB-INF/jsp/mainPage.jsp

MVC模式到传统风格的Spring MVC的更多相关文章

  1. Spring MVC 学习总结(八)——Spring MVC概要与环境配置(IDEA+Maven+Tomcat7+JDK8、示例与视频)

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  2. Spring MVC 学习总结(九)——Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务)

    很多时候前端都需要调用后台服务实现交互功能,常见的数据交换格式多是JSON或XML,这里主要讲解Spring MVC为前端提供JSON格式的数据并实现与前台交互.RESTful则是一种软件架构风格.设 ...

  3. Spring MVC学习总结(2)——Spring MVC常用注解说明

        使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 02     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使 ...

  4. Spring MVC学习总结(10)——Spring MVC使用Cors跨域

    跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求.比如说,域名A(http://domaina.examp ...

  5. Java Spring MVC项目搭建(一)——Spring MVC框架集成

    1.Java JDK及Tomcat安装 我这里安装的是JDK 1.8 及 Tomcat 8,安装步骤详见:http://www.cnblogs.com/eczhou/p/6285248.html 2. ...

  6. 【.NET特供-第三季】ASP.NET MVC系列:传统WebForm站点和MVC站点执行机制对照

    本文以图形化的方式,从'执行机制'方面对照传统WebForm站点和MVC站点. 请參看下面图形: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb2 ...

  7. Spring MVC学习总结(1)——Spring MVC单元测试

    关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...

  8. Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档

    Swagger 号称:世界最流行的API框架,官网:http://swagger.io/,Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总 ...

  9. Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题

    /login/login.html 进行form提交,登录之后的页面位于/main/frame.jsp; 这样的controller中的地址需要映射成/main/login.do,然后在control ...

随机推荐

  1. POJ 2886 Who Gets the Most Candies?(树状数组+二分)

    题目链接 注意题目中给的顺序是顺时针的,所以在数组中应该是倒着存的.左就是顺时针,右就是逆时针.各种调试之后,终于A了,很多种情况考虑情况. #include <cstring> #inc ...

  2. maven常用命令总结

    搞了多年java 似乎还有些命令 混混沌沌 今儿来总结下 mvn -v 查看版本 mvn -compile 编译当前工程 生成target目录的字节码文件以及报告 mvn -package 将当前工程 ...

  3. Centos6.8更好yum源

    第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back ...

  4. 数组、栈、堆(java基础知识五)

    1.数组概述.定义格式 * A:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基本数据类型,也可以存储引用数据类型. * B:数组定义格式 格式1:数据类型[ ...

  5. Silverlight DataBinding Converter:根据binding对象调整显示

    Silverlight DataBinding Converter:根据binding对象调整显示 我希望写一系列关于Silverlight DataBinding的文章,分别讲解Silverligh ...

  6. Oracle:手工建库

    今天学习了小布老师的手工建库视频,自己也做了一遍,下面是创建过程记录: 本地环境oracle10.2.0.1 一.前期准备工作 1.设置环境变量 [oracle@app dbs]$ vi bbk.en ...

  7. 为datanode配置多个数据存储地

    datanode配置多个数据存储地址,涉及到以下两个配置项 dfs.name.dir Determines where on the local filesystem the DFS name nod ...

  8. POJ3020 二分图匹配——最小路径覆盖

    Description The Global Aerial Research Centre has been allotted the task of building the fifth gener ...

  9. BZOJ_1563_[NOI2009]诗人小G_决策单调性

    BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超 ...

  10. BZOJ_1441_Min_数学+裴蜀定理

    BZOJ_1441_Min_数学+裴蜀定理 Description 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 Inpu ...