SpringMVC

         springMVC是表现层框架,也就是我们常说的Controller层。

一、MVC架构流程图:

 

1,组件说明:

 DispatcherServlet:前端控制器

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

 HandlerMapping:处理器映射器

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

 HandlAdapter:处理器适配器

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

 Handler:处理器

就是我们自己编写的Controller层

 ViewResolver:视图解析器

ViewResolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

 View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。就是前端写的页面。

说明:MVC中一个核心三大组件两个开发自己编写。核心:DispatcherServlet(前端控制器)。组件: HandlerMapping(处理器映射器)、HandlAdapter(处理器适配器)、ViewResolver(视图解析器)。自己编写:handler、view。

二、相关配置

1,web.xml配置

<!-- 前端控制器 -->
  <servlet>
  	<servlet-name>springmvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 默认找 /WEB-INF/[servlet的名称]-servlet.xml -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>springmvc</servlet-name>
  	<!-- 
  		1. /*  拦截所有   jsp  js png .css  真的全拦截   建议不使用
  		2. *.action *.do 拦截以do action 结尾的请求     肯定能使用   ERP  
  		3. /  拦截所有 (不包括jsp) (包含.js .png.css)  强烈建议使用     前台 面向消费者  www.jd.com/search   /对静态资源放行
  	 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>

2,springmvc.xml配置

 <!-- 扫描@Controler  @Service   -->
        <context:component-scan base-package="com.huawei"/>
        
        <!-- 处理器映射器 -->
        <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
        <!-- 处理器适配器 -->
        <!-- bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->
        <!-- 注解驱动 相当于 处理器映射器和处理器适配器-->
        <mvc:annotation-driven/>
<!-- Springmvc的异常处理器 -->
        <bean class="com.itheima.springmvc.exception.CustomExceptionResolver"/> 

		<!-- SPringmvc的拦截器 -->
		<mvc:interceptors>
			<!-- 多个拦截器 -->
			<mvc:interceptor>
				<mvc:mapping path="/**"/>
				<!-- 自定义的拦截器类 -->
				<bean class="com.itheima.springmvc.interceptor.Interceptor1"/>
			</mvc:interceptor>
        </mvc:interceptors>
        <!-- 视图解释器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        	<property name="prefix" value="/WEB-INF/jsp/"/>
        	<property name="suffix" value=".jsp"/>
        </bean>

三、SpringMVC异常处理器(了解)

1,自定义异常类

public class MessageException extends Exception{

	
	private String msg;

	public MessageException(String msg) {
		super();
		this.msg = msg;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
	
}

2,自定义异常处理器 实现HandlerExceptionResolver接口,重写方法

public class CustomExceptionResolver implements HandlerExceptionResolver{

	public ModelAndView resolveException(HttpServletRequest request, 
			HttpServletResponse response, Object obj,
			Exception e) {
		//  发生异常的地方 Serivce层  方法  包名+类名+方法名(形参) 字符串
		ModelAndView mav = new ModelAndView();
		//判断异常为类型
		if(e instanceof MessageException){
			//预期异常
			MessageException me = (MessageException)e;
			mav.addObject("error", me.getMsg());
		}else{
			mav.addObject("error", "未知异常");
		}
		mav.setViewName("error");
		return mav;
	}

}

四、RESTful风格

@RequestMapping("item/{id}")

@ResponseBody

public Item queryItemById(@PathVariable() Integer id) {

Item item = this.itemService.queryItemById(id);

return item;

}

1,使用注解@RequestMapping("item/{id}")声明请求的url,{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”

2,如果@RequestMapping中表示为"item/{id}",id和形参名称一致,@PathVariable不用指定名称。如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")

注意两个区别

1. @PathVariable是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)

2. 如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。如果不加,就走视图解析器,返回页面

五、MVC拦截器

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

1,自定义拦截器实现HandlerInterceptor接口,重写三个方法()

public class Interceptor1 implements HandlerInterceptor{

	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("方法前 1");
		return false;//true放行,false拦截
	}
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("方法后 1");
		
	}
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("页面渲染后 1");
		
	}

}

在这里只讲一下应用比较多的方法preHandle()方法前拦截处理,比如说在执行所有方法前先判断用户是否登录,若未登录则拦截,重定向跳转至登录页面

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值