list.action
跳转到一个商品列表的页面。web.xml
中添加一个DispatcherServlet[前端控制器]。web.xml
中配置DispatcherServlet前端控制器<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>*.actionurl-pattern>
servlet-mapping>
springmvc.xml
配置文件Source Folder
文件夹,在此新建springmvc.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.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
beans>
package com.itzhouq.springmvc.pojo
public class Items {
private Integer id;
private String name;
private Float price;
private String pic;
private Date createtime;
private String detail;
//set/get方法
}
/SpringMVC_01/WebContent/jsp/itemList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
查询商品列表
Controller
Controller
接口com.itzhouq.springmvc.controller.ItemsController
package com.itzhouq.springmvc.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.itzhouq.springmvc.pojo.Items;
public class ItemsController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 模拟商品数据
List<Items> list =new ArrayList<Items>();
for (int i = 0; i < 10; i++) {
Items items = new Items();
items.setId(i);
items.setCreatetime(new Date());
items.setName("小米手机"+i);
items.setDetail("国产");
items.setPrice((float) (1000*i));
list.add(items);
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList",list); // 相当于把数据放入了request域中
// ViewName逻辑视图:就是jsp路径
modelAndView.setViewName("/jsp/itemList.jsp");
return modelAndView;
}
}
@Controller
注解Controller
类中只能有一个方法。这显然不符合实际开发的需要。所以实际开发采用注解方式。com.itzhouq.springmvc.controller.ItemsController2
package com.itzhouq.springmvc.controller;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itzhouq.springmvc.pojo.Items;
@Controller
public class ItemsController2{
@RequestMapping("/list")
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 模拟商品数据
List<Items> list =new ArrayList<Items>();
for (int i = 0; i < 10; i++) {
Items items = new Items();
items.setId(i);
items.setCreatetime(new Date());
items.setName("华为手机"+i);
items.setDetail("也是国产");
items.setPrice((float) (1000*i));
list.add(items);
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList",list); // 相当于把数据放入了request域中
// ViewName逻辑视图:就是jsp路径
modelAndView.setViewName("/jsp/itemList.jsp");
return modelAndView;
}
}
Controller
配置到springmvc.xml
中Controller
接口的方式的配置springmvc.xml
中添加以下配置 <bean name="/list.action" class="com.itzhouq.springmvc.controller.ItemsController">
bean>
http://localhost/SpringMVC_01/list.action
的时候,请求会首先经过入口web.xml
。该文件中有一个前端控制器DispatcherServlet
,里面有配置*.action
。请求符合*.action
,所以请求会进入前端控制器中。前端控制器会初始化一个springMVC
容器。根据springMVC容器
的配置文件spring.xml
的配置。<bean name="/list.action" class="com.itzhouq.springmvc.controller.ItemsController">
bean>
list.action
和name
的值相同,所以请求进入到对应的类ItemsController
。执行类中的方法,跳转到类中写明的jsp
页面。@Controller
注解springmvc.xml
中开启注解扫描器。无需配置
。
<context:component-scan base-package="com.itzhouq.springmvc.controller">
context:component-scan>
@RequestMapping("/list")
定位ItemsController
类中的不同方法,解决传统开发方式的问题。1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器
(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
DispatcherServlet
:前端控制器
用户请求到达前端控制器,它就相当于mvc
模式中的c
,dispatcherServlet
是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet
的存在降低了组件之间的耦合性。dispatcherServlet
有三大组件。
HandlerMapping
:处理器映射器
HandlerMapping
负责根据用户请求找到Handler
即处理器,springmvc
提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
Handler
:处理器
Handler
是继DispatcherServlet
前端控制器的后端控制器,在DispatcherServlet
的控制下Handler
对具体的用户请求进行处理。由于Handler
涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler
。
springmvc.xml
文件中
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
bean>
通过HandlerAdapter
对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
springmvc.xml
文件中
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
bean>
<mvc:annotation-driven/>
View Resolver
:视图解析器
View Resolver
负责将处理结果生成View
视图,View Resolver
首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View
进行渲染将处理结果通过页面展示给用户。
View
:视图
springmvc
框架提供了很多的View
视图类型的支持,包括:jstlView
、freemarkerView
、pdfView
等。我们最常用的视图就是jsp
。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
springmvc.xml
文件配置如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/">property>
<property name="suffix" value=".jsp">property>
bean>
SpringMVC
和Mybatis
,展示商品的列表。Dao
层:
sqlMapConfig.xml
:可以为空,可以不需要applicationContext-dao.xml
:
SqlSessionFactory
对象,需要在Spring
和mybatis
整合包下的。mapper
文件扫描器,用来生成代理对象。Service
层:
application-service.xml
:事务管理、包扫描器【扫描@Service
注解】@Controller
注解的类web.xml
:
web
工程jar
包:mybatis
、mybatis
扩展包、spring
、spring
和mybatis
整合包、junit
、springmvc
。applicationContext-dao.xml
applicationContext-service.xml
jdbc.properties
log4j.properties
springmvc.xml
springmvc
,新建查询springmvc.sql
。SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for items
-- ----------------------------
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL COMMENT '商品名称',
`price` float(10,1) NOT NULL COMMENT '商品定价',
`detail` text COMMENT '商品描述',
`pic` varchar(64) DEFAULT NULL COMMENT '商品图片',
`createtime` datetime NOT NULL COMMENT '生产日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of items
-- ----------------------------
INSERT INTO `items` VALUES ('1', '台式机', '3000.0', '该电脑质量非常好!!!!', null, '2016-02-03 13:22:53');
INSERT INTO `items` VALUES ('2', '笔记本', '6000.0', '笔记本性能好,质量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '背包', '200.0', '名牌背包,容量大质量好!!!!', null, '2015-02-06 13:23:02');
web.xml
:加载applicationContext-*.xml
的监听器和解决乱码问题的监听器以及前端控制器
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>springmvc-mybatisdisplay-name>
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>*.actionurl-pattern>
servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext-*.xmlparam-value>
context-param>
web-app>
applicationContext-dao.xml
:加载数据库配置文件,将映射文件交给Spring
容器管理,配置映射器扫描器
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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-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/aop http://www.springframework.org/schema/aop/spring-aop-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/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.itzhouq.ssm.pojo">property>
bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itzhouq.ssm.mapper">property>
bean>
beans>
applicationContext-service.xml
:配置事务管理和使用注解需要的包扫描器
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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-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/aop http://www.springframework.org/schema/aop/spring-aop-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/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:component-scan base-package="com.itzhouq.ssm.service"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
tx:attributes>
tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.itzhouq.ssm.service.impl.*.*(..))" />
beans>
springmvc.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.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="com.itzhouq.ssm.controller">
context:component-scan>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/">property>
<property name="suffix" value=".jsp">property>
bean>
beans>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springmvc?characterEncoding=utf-8
jdbc.username=root
jdbc.password=2626
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
com.itzhouq.ssm.mapper.ItemsMapper
:持久层的接口package com.itzhouq.ssm.mapper;
import java.util.List;
import com.itzhouq.ssm.pojo.Items;
public interface ItemsMapper {
List<Items> findAll();
Items findById(int itemId);
}
com/itzhouq/ssm/mapper/ItemsMapper.xml
:持久层的映射器
<mapper namespace="com.itzhouq.ssm.mapper.ItemsMapper" >
<resultMap id="ItemsMap" type="com.itzhouq.ssm.pojo.Items" >
<id column="id" property="id" />
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="pic" property="pic" />
<result column="createtime" property="createtime"/>
resultMap>
<select id="findAll" resultMap="ItemsMap">
select * from items
select>
<select id="findById" parameterType="int" resultType="com.itzhouq.ssm.pojo.Items">
select * from items where id = #{id}
select>
mapper>
com.itzhouq.ssm.pojo.Items
package com.itzhouq.ssm.pojo;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
public class Items {
private Integer id;
private String name;
private Float price;
private String pic;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createtime;
private String detail;
//set/get方法
}
com.itzhouq.ssm.service.ItemService
:业务层的接口package com.itzhouq.ssm.service;
import java.util.List;
import com.itzhouq.ssm.pojo.Items;
public interface ItemService {
public List<Items> findAll();
public Items findById(int itemId);
}
com.itzhouq.ssm.service.impl.ItemServiceImpl
:业务层的实现类package com.itzhouq.ssm.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.itzhouq.ssm.mapper.ItemsMapper;
import com.itzhouq.ssm.pojo.Items;
import com.itzhouq.ssm.service.ItemService;
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ItemsMapper itemsMapper;
public List<Items> findAll() {
List<Items> list = itemsMapper.findAll();
return list;
}
@Override
public Items findById(int itemId) {
Items item = itemsMapper.findById(itemId);
return item;
}
}
com.itzhouq.ssm.controller.ItemsController
package com.itzhouq.ssm.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.itzhouq.ssm.pojo.Items;
import com.itzhouq.ssm.service.ItemService;
@Controller
public class ItemsController {
@Autowired
private ItemService itemService ;
@RequestMapping("/list")
public String showAllList(Model model){
List<Items> itemList = itemService.findAll();
model.addAttribute("itemList",itemList);
return "itemList";
}
// itemEdit.action?id=1
// 展示修改页面
@RequestMapping("/itemEdit")
public String itemEdit(@RequestParam(value="id",required=false,defaultValue="1")int itemId,HttpServletRequest request, HttpServletResponse response,Model model){
Items items = itemService.findById(itemId);
model.addAttribute("item", items);
// 逻辑视图:jsp的路径
return "editItem";
}
}
WebContent/jsp/itemList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
查询商品列表
WebContent/jsp/editItem.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
修改商品信息
@RequestParam
绑定参数id
查询商品信息,然后展示到页面。这时候的请求是/itemEdit.action?id=5
。这里假设id
为5。@RequestParam
注解来绑定。处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
HttpServletRequest request
HttpServletResponse response
HttpSession session
Model model
url
为/updateitem.action
。参数是表单中的数据。更新成功后需要跳转页面。如果提交的参数很多,或者表单中的内容很多的时候可以使用pojo
接收数据。要求是pojo
对象中的属性和表单中input
的name
属性一致。<input type="text" name="name"/>
<input type="text" name="price"/>
pojo
定义:pojo
的属性名称一致,会自动请求参数赋值给pojo
属性。pojo
类型的的过程中有可能会出现乱码问题。POST
请求,需要使用过滤器。在web.xml
中添加以下配置:<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
GET
请求,有两种解决办法。tomcat
服务器配置文件server.xml
第64行。String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
Controller
方法定义如下:public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getItems());
}
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
return null;
}
Converter
转化器public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
定义好转化器之后需要配置转化器,这里有两种配置方式。第二种更简单。
springmvc.xml
配置文件中添加如下配置:
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.springmvc.convert.DateConverter"/>
set>
property>
bean>
pojo
类的日期属性上添加如下注解:@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createtime;
由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping
标记的方法进行适配,并对方法中的形参进行参数绑定。在springmvc
这可以在处理器适配器上自定义Converter
进行参数绑定。如果使用
可以在此标签上进行扩展。
springmvc
的入口是一个servlet
即前端控制器,而struts2
入口是一个filter
过虑器。springmvc
是基于方法开发(一个url
对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2
是基于类开发,传递参数是通过类的属性,只能设计为多例。Struts
采用值栈存储请求和响应的数据,通过OGNL
存取数据, springmvc
通过参数解析器是将request
请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView
对象,最后又将ModelAndView
中的模型数据通过request
域传输到页面。Jsp
视图解析器默认使用jstl
。