Spring Mvc学习笔记

SpringMVC 介绍

什么是SpringMVC
Spring MVC和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来在这里插入图片描述
SpringMVC与Struts2的区别

对比点SpringMVCStruts2
程序入口一个Servlet即前端控制器一个Filter过虑器
接受参数使用局部变量。用完就会消失,是线程安全的。使用模型驱动:设置全局变量来接受参数。Action只能设计为多例,是线程不安全的。
开发模式基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例)。基于类开发,传递参数是通过类的属性,只能设计为多例。
相应数据通过参数解析器,将request域请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。采用值栈存储请求和响应的数据,通过OGNL存取数据。

SpringMVC的处理流程

SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,顶层是实现的Servlet接口。
在这里插入图片描述
跟踪SpringMVC的请求

  • 当请求离开浏览器时❶,会带有用户请求与内容的信息,还可能带有其他信息,例如用户提交的表单信息。
  • 第一站是Spring的DispatcherServlet(前端控制器)。与大多数java的Web框架一样,SpringMvc的所以请求都会通过一个前段控制器。前段控制器是常用的Web应用程序模式,在这里一个实例的Servlet将请求委托给应用程序的其他组件来执行实际的处理。
  • DispatcherServlet(前端控制器)的任务是将请求发给SpringMvc的Controller(控制器)。Controller(控制器)是一个用于处理请求的Spring的组件。在经典的应用程序中可能会有多个控制器,DispatcherServlet(前端控制器)需要知道应该讲请求发送给那一个Controller(控制器)。所以DispatcherServlet(前端控制器)会查询一个或多个HandlerMapping(处理器映射器)❷来确定请求的下一站在哪里。DispatcherServlet(前端控制器)会根据请求所携带的URL信息来进行决策。
  • 一旦选择了合适的控制器,DispatcherServlet(前端控制器)会将请求发送给选中的Controller(控制器)❸。到了控制器,请求会卸下其负载(用户提交的信息),并耐心等待Controller(控制器)处理这些信息。(实际上,良好设计的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象进行处理)
  • Controller(控制器)在完成业务逻辑后,通常会产生生一些信息,这些信息需要返回给用户并在浏览器上显示。这些信息被称为Model(模型)。不过仅仅给用户返回原始的信息是不够的,这些信息需要用户友好的方式进行格式化,一版会是HTML。所以,信息需要发送给一个View(视图),通常是JSP。
  • 控制器所做的最后一件事就是将模型数据打包,并表示出用于渲染的视图名。他接下来回将请求与连同ModelAndView(模型和视图)名发送回DispatcherServlet(前端控制器)❹。
  • 这样,控制器就不会与特定的视图相耦合,传递给DispatcherServlet(前端控制器)的视图名并不直接表示某个特定的JSP。实际上,它甚至并不能确定视图就是JSP。相反,他仅仅传递了一个逻辑名称,这个名字将会用来查找产生的真正视图。DispatcherServlet(前端控制器)将会使用ViewResolver(视图解析器)❺来将逻辑视图名匹配为一个特定的视图实现。
  • 既然DispatcherServlet(前端控制器)已经知道由哪一个视图渲染结果,那请求的任务基本上也就完成了。他最后的一站是View(视图)的实现❻,在这里他交付Model(模型)数据,请求的任务就完成了。视图将使用模型数据渲染输出,这个输出会通过相应对象传递给客户端(浏览器)❼。
  • 可以看到请求经过很多的步骤,最终才能形成返回给客户端的相应。大多数是在Spring框架内部完成的,我们只需要配置相应的组件。

总结出来就是以下几点:
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle),通过xml配置或者注解进行查找
第三步:找到以后处理器映射器向前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器调用处理器适配器(HandlerAdapter)
第五步:处理器适配器去执行处理器
第六步:处理器执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器向前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果

SpringMVC的几个重要组件

  • 前端控制器(DispatcherServlet):它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。相当于电脑的CPU。
  • 处理器映射器(HandlerMapping):HandlerMapping负责根据用户请求找到Handler,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  • 处理器(Handler):Handler 是继DispatcherServlet的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler,相当于Controller。
  • 处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,相当于各种转换线。在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 视图解析器(ViewResovler):View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • 视图(View) :SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
    源码分析:深入了解SpringMVC
    在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。

Spring MVC包的结构

Spring 基础环境配置

在web.xml中添加DispatcherServlet(前端控制器)的配置

<!-- 前端控制器 -->
<servlet>
	<servlet-name>springmvc</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>	
  	<!-- 如果没有指定springMvc核心配置文件那么默认会去找/WEB-INF/+ <servlet-name>中的内容 + -servlet.xml配置文件 -->
  	<!-- 指定springMvc核心配置文件位置 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springmvc.xml</param-value>
	</init-param>
	<!-- tomcat启动的时候就加载这个servlet -->
  	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springmvc</servlet-name>
		<!-- 	*.action    代表拦截后缀名为.action结尾的 -->
		<!-- 	/ 		     	拦截所有但是不包括.jsp -->
		<!--  	/* 		    	拦截所有包括.jsp -->
	<url-pattern>*.action</url-pattern>
</servlet-mapping>

核心SpringMVC配置文件

<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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:dubbo="http://code.alibabatech.com/schema/dubbo"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.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 	<!-- 组件扫描 扫描 com.lsy.controller 下的@Controller注解的类 -->
	<context:component-scanbase-package="com.lsy.controller"/>
</beans>

测试程序
SpringMVCTest是一个普通的java类,不需要实现任何接口。只需要在方法上添加@Controller注解即可。

@Controller
public class SpringMVCTest{

	@RequestMapping("/itemList")
	public String itemList()  {
		System.out.printf("控制台输出SpringMVC");
		return "/WEB-INF/jsp/itemList.jsp";
	}
}

配置文件详解

Post请求乱码

  • 在web.xml中添加DispatcherServlet(前端控制器)的配置
 <!-- 配置Post请求乱码 -->
 <filter>
	<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

Get请求乱码

URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.

这就意味着,从tomcat8.0开始,get请求中的中文参数,不需要特殊处理了。而如果是tomcat8之前的项目要迁移到tomcat8上面来,则也需要特殊注意这个问题,可能要删减代码中响应乱码的处理模块了。

组件扫描器

  • 使用组件扫描器,省去在Spring容器配置每个Controller类的繁琐。使用<context:component-scan>自动扫描标记@controller的控制器类。
<!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
<context:component-scanbase-package="com.lsy.controller"/>

处理器映射器和处理器适配器

  • RequestMappingHandlerMapping:对类中标记@ResquestMapping的方法进行映射。根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。
<!--注解映射器 不推荐 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  • RequestMappingHandlerAdapter:对类中标记@ResquestMapping的方法进行适配。
<!--注解适配器 不推荐 -->
<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  • SpringMVC中使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
<!-- 注解驱动 : 自动加载处理器映射器和处理器适配器 -->
<mvc:annotation-driven />

视图解析器(Spring自带13种视图解析器)

  • FreeMakerViewResolver:将视图解析为FreeMaker模板。
  • ThymeleafViewResolver:用来替代JSP的新技术,Spring提供了其原生模板协作的视图解析器
  • InternalResourceViewResolver:将视图解析为Web应用的内部资源(一般为JSP)。
    • 配置InternalResourceViewResolver
    • ViewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包。此属性可以不设置,默认为JstlView。
    • prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀.
    • 逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
<!-- InternalResourceViewResolver:支持JSP视图解析 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 真正的页面路径 =  前缀 + 去掉后缀名的页面名称 + 后缀 -->
		<propertyname="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<!-- 前缀 -->
		<propertyname="prefix"value="/WEB-INF/jsp/"/>
		<!-- 后缀 -->
		<propertyname="suffix"value=".jsp"/>
</bean>

转换器Converter

  • 自定义参数绑定
  • 自定义转换器原本应配置在处理器适配器中,因为使用了<mvc:annotation-driven>自懂加载替换了原本的处理器适配器,故应配置在注解驱动中。
	<!-- 加载注解驱动 -->
	<mvc:annotation-driven conversion-service="conversionService" />
	<!-- 配置自定义转换器 -->
	<!-- 注意: 一定要将自定义的转换器配置到注解驱动上 -->
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<propertyname="converters">
			<set>
				<!-- 指定自定义转换器的全路径名称 -->
				<beanclass="com.lsy.convert.DateConverter"/>
			</set>
		</property>
	</bean>

SpringMVC 参数绑定

SpringMVC默认支持的类型

  • HttpServletRequest :通过request对象获取请求信息
  • HttpServletResponse:通过response处理响应信息
  • HttpSession:通过session对象得到session中存放的对象
  • Model/ModelMap:ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据
Items item = itemService.findItemById(id);
model.addAttribute("item", item);
//页面通过${item.xxx}获取item对象的属性值.

使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。

绑定简单数据类型

  • 当请求的参数名称和处理器形参名称一致时,会将请求参数与形参进行绑定。可以进一步简化从Request取参数的方式。
public String login(Model model,Integer id,Boolean status,String user){

} 

参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。

  • @RequestParam:常用于处理简单类型的绑定
    • value:参数名字,即传入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
      如果请求参数中没有item_id:HTTP Status 500 - Required Integer parameter ‘item_id’ is not present
    • required:是否必须,默认是true,表示请求中一定要有相应的参数,如果没有:TTP Status 400 - Required Integer parameter ‘XXXX’ is not present
    • defaultValue:默认值,表示如果请求中没有同名参数时的默认值
//形参名称为id,但是这里使用value="item_id"限定请求的参数名为item_id。
public String login(@RequestParam(value="item_id",required=true) String id) {

}

绑定pojo类型
要求pojo对象中的属性名和表单中input的name属性一致。
注意:提交的表单中不要有日期类型的数据,否则会报400错误。原因:String类型无法转换成Date类型。
如果想提交日期类型的数据需要后面的自定义参数绑定的内容。

public String updateItem(Items items) {

}

绑定VO类型(包装的pojo)
如果是VO类型

	public String queryItem(QueryVo queryVo) {
		//页面定义<input type="text" name="items.name" />
		//页面定义<input type="text" name="items.price" />
		System.out.println(queryVo.getItems().getName());
		System.out.println(queryVo.getItems().getPrice());
		return null;
	}

自定义参数绑定

  • 在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。
  • 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。
  • 在SpringMVC这可以在处理器适配器上自定义Converter进行参数绑定。如果使用<mvc:annotation-driven/>可以在此标签上进行扩展。
/**
* Converter<S,T>
* S - source:源
* T - target:目标
*/
publicclass DateConverter implements Converter<String, Date> {
	//需要继承Converter类
	@Override
	public Date convert(String source) {
		try {
			//自定义转换规则
			Date date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
			return date;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

  • 配置自定转换器(上文有提及 在配置文件详情中)
  • 显示的配置自定义转换器(了解):自定义转换器配置在处理器适配器中。
<!-- 转换器配置 -->
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<propertyname="converters">
			<set>
				<beanclass="cn.itcast.springmvc.convert.DateConverter"/>
			</set>
		</property>
	</bean>
	<!-- 自定义webBinder -->
	<bean id="customBinder"	class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
		<propertyname="conversionService"ref="conversionService"/>
	</bean>
	<!--注解适配器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<propertyname="webBindingInitializer"ref="customBinder"></property>
	</bean>
	<!-- 注解处理器映射器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

绑定list

  • jsp中的代码
<c:forEach items="${itemList }" var="item">
<tr>
	<td><input name="ids" value="${item.id}" type="checkbox"></td>
	<td>${item.name }</td>
	<td>${item.price }</td>
	<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
	<td>${item.detail }</td>
	<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>

  • Controller中代码
	//Controller方法中可以用String[]接收,或者pojo的String[]属性接收。以下是String[]接受。
	public String delItem(QueryVo queryVo, Integer[] ids) {
		System.out.println(queryVo.getItems().getName());
		System.out.println(queryVo.getItems().getPrice());
		System.out.println(ids.toString());
		return null;
	}

SpringMVC 注解

@RequestMapping

  • 通过RequestMapping注解可以定义不同的处理器映射规则
  • URL路径映射

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

  • 窄化请求映射

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

  • 请求方法限定

限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported

限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported

GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

SpringMVC 表单验证

SpringMVC 返回值

ModelAndView

modelAndView.addObject(“itemList”, list); 指定返回页面的数据
modelAndView.setViewName(“itemList”); 指定返回的页面

String(推荐使用)

返回普通字符串,就是页面去掉扩展名的名称, 返回给页面数据通过Model来完成
返回的字符串以forward:开头为请求转发
返回的字符串以redirect:开头为重定向

void(破坏了springMvc的结构,所以不建议使用)

  • 如果controller返回值为void则不走springMvc的组件,所以要写页面的完整路径名称

使用request.setAttribut( ) 来给页面返回数据
request.getRequestDispatcher(“页面路径”).forward(request, response); 实现请求转发
response.sendRedirect(“url”); 实现重定向

全局异常处理

  • 为了防止项目上线后给用户抛异常信息,所以需要在架构级别上整体处理全局异常

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理

在这里插入图片描述

  • 自定义全局异常处理器:实现HandlerExceptionResolver接口
//自定义全局异常处理
public class CustomGlobalExceptionResolver implements HandlerExceptionResolver{

	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception exc) {
		//输出异常
		ex.printStackTrace();
		//保存异常信息
		String msg = "";
		//判断异常类型
		if(exc instanceof CustomException){
			//处理业务级别异常
			msg = ((CustomException)exc).getMessage();
		} else {
			//处理运行时异常
			msg = "系统异常, 亲,对不起, 请及时联系管理员哦!";
		}
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("msg", msg);
		modelAndView.setViewName("error");
		return modelAndView;
	}

}
  • 在spirngMvc.xml中配置生效
<!-- 配置全局异常 -->
<bean id="handlerExceptionResolver" class="com.lsy.controller.exceptionResolver.CustomExceptionResolver"/>

文件上传

  • 配置解析器
	<!-- 定义文件上传解析器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设定默认编码 -->
		<property name="defaultEncoding" value="UTF-8"></property>
		<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
		<property name="maxUploadSize" value="5242880"></property>
	</bean>
  • JSP在这里插入图片描述
  • Controller
@Controller
public class PictureController {
	
	@Value("${IMAGE_SERVER_URL}")
	private String IMAGE_SERVER_URL;

	@RequestMapping("/pic/upload")
	@ResponseBody
	public Map fileUpload(MultipartFile uploadFile) {
		try {
			//1、取文件的扩展名
			String originalFilename = uploadFile.getOriginalFilename();
			String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
			//2、创建一个FastDFS的客户端
			FastDFSClient fastDFSClient = new FastDFSClient("classpath:resource/client.conf");
			//3、执行上传处理
			String path = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);
			//4、拼接返回的url和ip地址,拼装成完整的url
			String url = IMAGE_SERVER_URL + path;
			//5、返回map
			Map result = new HashMap<>();
			result.put("error", 0);
			result.put("url", url);
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			//5、返回map
			Map result = new HashMap<>();
			result.put("error", 1);
			result.put("message", "图片上传失败");
			return result;

/**
*		// 1. 获取图片完整名称
*		String fileStr = pictureFile.getOriginalFilename();
*		//2. 使用随机生成的字符串+源图片扩展名组成新的图片名称,防止图片重名
*		String newfileName = UUID.randomUUID().toString() + fileStr.substring(fileStr.lastIndexOf("."));
*		//3. 将图片保存到硬盘
*		pictureFile.transferTo(new File("E:\\image\\" + newfileName));
*		//4.将图片名称保存到数据库
*		items.setPic(newfileName);
*		itmesService.updateItems(items);
*		//返回数据
*		return "redirect:itemEdit/"+items.getId();
*/
		}
	}
}

JSON交互

  • @Requestbody

    • @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
    • @RequestBody注解实现接收http请求的json数据,将页面传到controller中的json格式字符串自动转换成java的pojo对象
  • @ResponseBody

    • 该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
    • @ResponseBody注解实现将controller方法中java的pojo对象自动转换成json格式字符串转换为json响应给客户端
	//@RequestBody,让spirngMvc将json格式字符串自动转换成java中的pojo
	//页面json的key要等于java中pojo的属性名称
	/Controller方法返回pojo类型的对象并且用@ResponseBody注解,SpringMVC会自动将pojo对象转换成json格式字符串
	@RequestMapping("/sendJson")
	@ResponseBody
	public Items json(@RequestBody Items items) throws Exception{
		System.out.println(items);
		return items;
	}

restful规范

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。
资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数
Url格式:http://blog.csdn.net/beat_the_world/article/details/45621673
资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。

@RequestMapping(value="/ viewItems/{id}"):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

	//页面跳转
	@RequestMapping("/page/{topage}") 
	public String topage(@PathVariable("topage") String page) {
		return page;
}

SpringMVC 拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

  • 拦截器定义
实现HandlerInterceptor接口
Public class login implements HandlerInterceptor{

	/**
	 * controller执行前调用此方法
	 * 返回true表示继续执行,返回false中止执行
	 * 这里可以加入登录校验、权限拦截等
	 */
	@Override
	Public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		Return false;
	}
	/**
	 * controller执行后但未返回视图前调用此方法
	 * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
	 */
	@Override
	Public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		
	}
	/**
	 * controller执行后且视图返回后调用此方法
	 * 这里可得到执行controller时的异常信息
	 * 这里可记录操作日志,资源清理等
	 */
	@Override
	Public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {
		// TODO Auto-generated method stub
		
	}

}

  • springmvc.xml配置拦截器
<!-- 配置拦截器 -->
	<mvc:interceptors>
		<!-- 多个拦截器的执行顺序等于springMvc.xml中的配置顺序 -->
		<mvc:interceptor>
			<!-- 拦截请求的路径    要拦截所有必需配置成/** -->
			<mvc:mapping path="/**"/>
			<!-- 指定拦截器的位置 -->
			<bean class="com.lsy.interceptor.login "></bean>
		</mvc:interceptor>
	</mvc:interceptors>
  • 静态资源拦截
    如果在DispatcherServlet中设置<url-pattern>/</url-pattern>则必须对静态资源进行访问处理。
    spring mvc 的<mvc:resources mapping="" location="">实现对静态资源进行映射访问。
    例如:<mvc:resources location="/js/" mapping="/js/**"/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值