springMVC学习笔记

来源:互联网 发布:caffe绘制网络结构图 编辑:程序博客网 时间:2024/06/06 09:35

web MVC 流程

web MVC流程

步骤:
1. 用户发起request请求至控制器(Controller)控制接收用户请求的数据,委托给模型进行处理
2. 控制器通过模型(Model)处理数据并得到处理结果模型通常是指业务逻辑
3. 模型处理结果返回给控制器
4. 控制器将模型数据在视图(View)中展示web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。
5. 控制器将视图response响应给用户通过视图展示给用户要的数据或处理结果。

springMVC流程

springMVC流程

步骤:
1. 用户发送请求至前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器,用于查找Handeller,可以根据xml配置、注解查找。
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响应用户

组件说明:
1、DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

4、HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

5、View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

配置文件

1、前端控制器配置(在WEB-INF\web.xml中配置前端控制器)

<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>//load-on-startup:表示servlet随服务启动;//url-pattern:*.action的请交给DispatcherServlet处理。//contextConfigLocation:指定springmvc配置的加载位置

Servlet拦截方式
1、拦截固定后缀的url,比如设置为 .do、.action, 例如:/user/add.action 。此方法最简单,不会导致静态资源(jpg,js,css)被拦截。
2、拦截所有,设置为/,例如:/user/add /user/add.action 。此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。
但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。
3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

2、springMVC配置文件(在WEB-INF\web.xml中配置)

<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param>//如上代码,通过contextConfigLocation加载classpath下的springmvc.xml配置文件。

3、配置处理器映射器(在springMVC.xml文件上配置)

<!-- 处理器映射器 -->    <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 --><beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /><!--BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url。-->

4、配置处理器适配器(在springMVC.xml文件上配置)

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> //SimpleControllerHandlerAdapter:即简单控制器处理适配器//所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean作为Springmvc的后端控制器。//springMVC提供不同的处理器适配器,所以控制器开发需要根据不同的处理器适配器的接口进行开发

5、处理器开发
6、处理器配置(开发的处理器要在springMVC上进行配置)

<!-- controller配置 -->    <bean name="/items1.action" id="itemList1" class="cn.itcast.springmvc.controller.first.ItemList1"/>    <!-- name="/items1.action":前边配置的处理器映射器为BeanNameUrlHandlerMapping,如果请求的URL 为“上下文/items1.action”将会成功映射到ItemList1控制器。 所以配置方式时,处理器配置的name属性十分重要 -->

7、配置视图解析器

<!-- ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>

InternalResourceViewResolver:支持JSP视图解析
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;
prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:
前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”

8、视图开发


以上是配置文件上的处理,接下来是注解方式配置映射器和适配器:
0、组件扫描器
使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用

<!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->    <context:component-scan base-package="cn.itcast.springmvc.controller.first"/>

1、注解方式配置HandlerMapping处理器映射器
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。

<!--注解映射器 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

注解描述:
@RequestMapping:定义请求url到处理器功能方法的映射

2、注解方式配置处理器适配器RequestMappingHandlerAdapter

<!--注解适配器 -->    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

坑爹的 mvc:annotation-driven
springmvc使用mvc:annotation-driven自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用mvc:annotation-driven替代注解处理器和适配器的配置。

这里写图片描述

控制器例子:

@Controllerpublic class ItemList3 {    @RequestMapping("/queryItem.action")    public ModelAndView queryItem() {        // 商品列表        List<Items> itemsList = new ArrayList<Items>();        Items items_1 = new Items();        items_1.setName("联想笔记本");        items_1.setPrice(6000f);        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");        Items items_2 = new Items();        items_2.setName("苹果手机");        items_2.setPrice(5000f);        items_2.setDetail("iphone6苹果手机!");        itemsList.add(items_1);        itemsList.add(items_2);        // 创建modelAndView准备填充数据、设置视图        ModelAndView modelAndView = new ModelAndView();        // 填充数据        modelAndView.addObject("itemsList", itemsList);        // 视图        modelAndView.setViewName("order/itemsList");        return modelAndView;    }}

springMVC重要内容

1、@RequestMapping
通过RequestMapping注解可以定义不同的处理器映射规则。

URL路径映射
@RequestMapping(value=”/item”)或@RequestMapping(“/item)
value的值是数组,可以将多个url映射到同一个方法

窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。

如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping(“/item”)

方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping(“/queryItem “)

访问地址为:/item/queryItem

请求方法限定
限定GET方法
@RequestMapping(method = RequestMethod.GET)

如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported

2、controller方法返回值
返回ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

返回void
在controller**方法形参上可以定义request和response**,使用request或response指定响应结果:

1、使用request转向页面,如下:
request.getRequestDispatcher(“页面路径”).forward(request, response);

2、也可以通过response页面重定向:
response.sendRedirect(“url”)

3、也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding(“utf-8”);
response.setContentType(“application/json;charset=utf-8”);
response.getWriter().write(“json串”);

返回字符串
逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/item/editItem.jsp
return “item/editItem”;

Redirect重定向
Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。
//重定向到queryItem.action地址,request无法带过去
return “redirect:queryItem.action”;

redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:/item/queryItem?…&…..

forward转发
controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。
//结果转发到editItem.action,request可以带过去
return “forward:editItem.action”;

forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。

controller参数绑定

这里写图片描述

默认支持参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。

HttpServletRequest
通过request对象获取请求信息

HttpServletResponse
通过response处理响应信息

HttpSession
通过session对象得到session中存放的对象
Model/ModelMap
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据,如下:

//调用service查询商品信息
Items item = itemService.findItemById(id);
model.addAttribute(“item”, item);

页面通过${item.XXXX}获取item对象的属性值。
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。

简单参数类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
整型
public String editItem(Model model,Integer id) throws Exception{

字符串
单精度/双精度
布尔型
处理器方法:
public String editItem(Model model,Integer id,Boolean status) throws Exception

请求url:
http://localhost:8080/springmvc_mybatis/item/editItem.action?id=2&status=false

说明:对于布尔类型的参数,请求的参数值为true或false。

@RequestParam
使用@RequestParam常用于处理简单类型的绑定。

value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present

defaultValue:默认值,表示如果请求中没有同名参数时的默认值

定义如下:
public String editItem(@RequestParam(value=”item_id”,required=true) String id) {

}

形参名称为id,但是这里使用value=” item_id”限定请求的参数名为item_id,所以页面传递参数的名必须为item_id。
注意:如果请求参数中没有item_id将跑出异常:
HTTP Status 500 - Required Integer parameter ‘item_id’ is not present

这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值

pojo类型
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。

自定义参数绑定

public class CustomDateConverter implements Converter<String, Date> {    @Override    public Date convert(String source) {        try {            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            return simpleDateFormat.parse(source);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}
//配置mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven><!-- conversionService -->    <bean id="conversionService"        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">        <!-- 转换器 -->        <property name="converters">            <list>                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>            </list>        </property>    </bean>
0 0
原创粉丝点击