SpringMVC学习笔记整理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


SpringMVC

SpringMVC的基本概念

网络编程回顾

BS三层架构

浏览器 ----> 表现层 ----> 业务层 ----> 持久层

Browser <---- SpringMVC <---- Spring <---- MyBatis

MVC设计模型

M Model模型 JavaBean

V View视图 JSP

C Controller控制器 Servlet

SpringMVC优势

  • 清晰的角色划分

      前端控制器 (DispatcherServlet)
      请求到处理器映射 (HandlerMapping)
      处理器适配器 (HandlerAdapter)
      视图解析器 (ViewResolver)
      处理器或页面控制器 (Controller)
      验证器 (Validator)
      命令对象 (Command)
      表单对象 (Form Object)
    
  • 分工明确,容易扩展

SpringMVC 和 Strust2的优劣分析

共同点:

  • 都是表现层框架,都是基于MVC模型编写的
  • 底层都离不开原始ServletAPI
  • 处理请求的机制都是一个核心控制器

区别:

  • SpringMVC入口是一个Servlet;Strust2是Filter
  • SpringMVC是基于方法设计的;Strust2基于类设计,每次执行都会创建一个动作类的对象。因此SpringMVC更快
  • SpringMVC更加简洁,处理ajax请求更方便,支持JSR303
  • Strust2的OGNL表达式使页面开发效率比SpringMVC更高

SpringMVC的入门

web配置 web.xml

SpringMVC以Servlet为核心,而前端控制器DispatcherServlet就是这个指挥中心

  • 将请求引导至SpringMVC各控制器对象
  • 将控制器响应转发给视图解析器对象
  • 将结果返回给浏览器
		<!DOCTYPE web-app PUBLIC
		 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
		 "http://java.sun.com/dtd/web-app_2_3.dtd" >
		
		<web-app>
		  <display-name>Archetype Created Web Application</display-name>
		
		  <!--配置前端控制器DispatcherServlet-->
		  <servlet>
		    <servlet-name>dispatcherServlet</servlet-name>
		    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		    <!--加载xml配置文件-->
		    <init-param>
		      <param-name>contextConfigLocation</param-name>
		      <param-value>classpath:bean.xml</param-value>
		    </init-param>
		    <!--启动服务器时创建Servlet对象-->
		    <load-on-startup>1</load-on-startup>
		  </servlet>
		
		  <!--配置前端控制器的路径-->
		  <servlet-mapping>
		    <servlet-name>dispatcherServlet</servlet-name>
		    <url-pattern>/</url-pattern>
		  </servlet-mapping>
		</web-app>

Spring模块 bean.xml


	<?xml version="1.0" encoding="UTF-8"?>
	<beans xmlns="http://www.springframework.org/schema/beans"
	       xmlns:mvc="http://www.springframework.org/schema/mvc"
	       xmlns:context="http://www.springframework.org/schema/context"
	       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.xsd
	       http://www.springframework.org/schema/mvc
	       http://www.springframework.org/schema/mvc/spring-mvc.xsd
	       http://www.springframework.org/schema/context
	       http://www.springframework.org/schema/context/spring-context.xsd">
	
	    <!--开启注解扫描-->
	    <context:component-scan base-package="com.zjuee"/>
	
	    <!--视图解析器对象-->
	    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	        <!--视图文件路径开头 (目录)-->
	        <property name="prefix" value="/WEB-INF/pages/"/>
	        <!--视图文件路径结尾 (格式) -->
	        <property name="suffix" value=".jsp"/>
	    </bean>
	
	    <!--开启SpringMVC框架注解的支持-->
	    <mvc:annotation-driven/>
	
	</beans>

控制层Controller

RequestMapping:用于建立请求URL和处理请求方法之间的关系

属性:

  • path = /user/hello 相对路径
  • value 与path相同
  • method={} 访问方法 get post…
  • params={} 限制请求参数
  • headers={} 限制请求头

		/**
		 * 控制器类
		 * 该类被扫描后,创建为对象并加载进容器
		 */
		@Controller("helloController")
		@RequestMapping("/user")
		public class HelloController {
		
		    /**
		     * 入门案例
		     * RequestMapping:用于建立请求URL和处理请求方法之间的关系
		     * 属性
		     *      path = /user/hello 相对路径
		     *      value 与path相同
		     *      method={}  访问方法 get post...
		     *      params={}  限制请求参数
		     *      headers={} 限制请求头
		     * @return
		     */
		    @RequestMapping(path = "/testRM", params = {"username=hehe"}, headers = {"Accept"})
		    public String testRequestMapping() {
		        System.out.println("测试RequestMapping注解...");
		        return "success";
		    }
		}


请求参数的绑定

  1. Spring的参数绑定过程就是把表单提交的请求参数,作为控制器中方法的参数进行绑定。
    要求提交表单的name和参数的名称是相同的。

  2. 支持的数据类型

    • 基本数据类型和字符串类型
    • 实体类型(JavaBean)
    • 集合数据类型(List、map集合等)
  3. 解决中文乱码问题

web.xml中配置过滤器filter,拦截所有request并将其编码为utf-8格式


	  <!--配置解决中文乱码的过滤器-->
	  <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>

  1. 自定义类型

前端接受的数据都是字符串类型,SpringMVC自动将字符串封装到JavaBean等对象,但有些类型对应的字符串格式是有限的,可以自己设计Converter转换器将字符串转换为需要的数据格式。

自定义的转换器


	/**
	 * 把字符串转换为日期
	 */
	public class StringToDateConverter implements Converter<String, Date> {
	
	    @Override
    public Date convert(String source) {
        if(source == null || source.length() == 0) {
            throw new RuntimeException("生日不能为空");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        // 把字符串转换成日期
        try {
            return df.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

在bean.xml中将自定义的转换器配置进SpringMVC框架中。

	    <!--配置自定义类型转换器-->
	    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
	        <property name="converters">
	            <set>
	                <bean class="com.zjuee.utils.StringToDateConverter"/>
	            </set>
	        </property>
	    </bean>
	
	    <!--开启SpringMVC框架注解的支持-->
	    <mvc:annotation-driven conversion-service="conversionService"/>


常用注解

@RequestParam

作用:把请求中指定名称的参数给控制器的形参赋值


	@RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name="name") String username) {
        System.out.println(username);
        return "success";
    }

@RequestBody

作用:用于获取请求体。直接使用得到的是key=value&key=value…结构的数据
get请求方式不适用

属性:required:是否必须有请求体

	@RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body) {
        System.out.println(body);
        return "success";
    }

@PathVariable

REST风格URL

由请求地址和请求方式确定请求的方法

	
		@RequestMapping(path="/testPathVariable/{sid}, method={RequestMethod.GET")
	    public String testPathVariable(@PathVariable(name="sid") String id) {
	        System.out.println("执行了...");
	        System.out.println(id);
	        return "success";
	    }

@HiddenHttpMethodFilter过滤器

将POST、GET方式转为PUT、DELETE等浏览器不支持的方式

@RequestHeader

取出给定请求头的请求头


    @RequestMapping(path = "/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
        System.out.println(header);
        return "success";
    }

@CookieValue

从Cookie中取出给定键名的值


    @RequestMapping(path = "/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
        System.out.println(cookieValue);
        return "success";
    }

@ModelAttribute

ModelAttribute注解的方法先于控制器执行,因此可以将一些数据存在model域中,控制器的方法可以直接从域中取数据,也可以由键名从域中取出数据。展示的是用键名来取。


    @RequestMapping(path = "/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user) {
        System.out.println("MA执行了...");
        System.out.println(user);
        return "success";
    }


    @ModelAttribute
    public void showUser(String username, Map<String,User> map) {
        System.out.println("showUser执行了");
        // 通过用户名查询数据库 (模拟)
        User user = new User();
        user.setUname(username);
        user.setAge(20);
        user.setBirthday(new Date());
		// 将完整的user信息以键值对形式放到model域中
        map.put("abc",user);
    }

@SessionAttribute


	@RequestMapping(value = "/testSessionAttribute")
    public String testSessionAttribute(Model model) {
        System.out.println("addSessionAttributes");
        model.addAttribute("msg", "鬼鸿");  // 分别存到session和request域中
        return "success";
    }

    @RequestMapping(value = "/getSessionAttribute")
    public String getSessionAttribute(ModelMap modelMap) {
        System.out.println("getSessionAttributes");
        Object msg = modelMap.get("msg");
        System.out.println(msg.toString());
        return "success";
    }

    @RequestMapping(value = "/delSessionAttribute")
    public String delSessionAttribute(SessionStatus status) {
        System.out.println("delSessionAttribute");
        status.setComplete();
        return "success";
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值