Springmvc知识点

Springmvc

  1. 回顾
    1. 理解MVC设计模式
      • 视图(View)-对应组件:JSP或者HTML文件
      • 控制器(Controller)-对应组件:Servlet
      • 模型(Model) -对应组件:JavaBean
    2. MVC 优点
      • 多视图共享一个模型,大大提高代码的可重用性
      • MVC三个模块相互独立,松耦合架构
      • 控制器提高了应用程序的灵活性和可配置性
      • 有利于软件工程化管理
    3. 完美的系统架构 = 松耦合+高重用性+高扩展性
  2. Spring MVC框架搭建步骤
    1. 下载jar文件并导入工程
      • spring-web-3.2.13.RELEASE.jar
      • spring-webmvc-3.2.13.RELEASE.jar
    2. 配置文件
      • 在web.xml中配置Servlet
      • 创建Spring MVC的配置文件
    3. 创建Controller-处理请求的控制器
      • BeanNameUrlHandlerMapping
    4. 创建View-jsp
    5. 部署运行
  3. Web.xml
    1. 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-servlet.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>
  4. Springmvc.xml
    1. <bean name="/index.action" class="com.company.controller.IndexController"></bean>
      	    
      <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      	<property name="prefix" value="/WEB-INF/jsp/"/>
      	<property name="suffix" value=".jsp"></property>
      </bean>

       

  5. 创建Controller
    1. IndexController 
      public class IndexController extends AbstractController {
      
      	@Override
      	protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
      		System.out.println("hello, SpringMVC");
      		return new ModelAndView("index");
      	}
      }

       

  6. 注解驱动控制器
    1. 基于注解的处理器
      1. <context:component-scan />

    2. @Controller

      • 标注一个普通的JavaBean成为可以处理请求的控制器
    3. @RequestMapping
      1. 通过请求URL进行映射
    4. 配置MVC注解驱动
      1. <mvc:annotation-driven /><!-- 配置注解驱动 -->

      2. 自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter
      3. 提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持
  7. SpringMVC请求的流程

  8. Spring MVC体系结构
    1. DispatcherServlet(前端控制器)
      1. web.xml中配置
      2. Spring MVC最核心的类
    2. Handler(处理器):对应MVC中C(Controller)
      1. 标注了@RequestMapping的所有方法都可以看作是一个Handler
      2. 作用:实际处理请求
      3. 类型:Object
    3. ModelAndView(视图解析器)
      • 逻辑视图名
      • 模型对象
  9. 核心组件
    1. HandlerMapping(处理器映射)
      • BeanNameUrlHandlerMapping(默认)
        1. 将请求URL映射到同名的控制器Bean上
      • DefaultAnnotationHandlerMapping
        1. 将请求映射到标注@RequestMapping注解的控制器和处理方法上
      • RequestMappingHandlerMapping
    2. HandlerAdapter(适配器)
      1. RequestMappingHandlerAdapter
      2. AnnotationMethodHandlerAdapter
    3. ViewResolver(视图解析器)
      • InternalResourceView
  10. Springmvc框架特点
    1. 清晰地角色划分
    2. 灵活的配置功能
    3. 提供了大量的控制器接口和实现类
    4. 真正做到了View层的实现无关(JSP,VUE,angularjs)
    5. 国际化支持
    6. 面向接口编程
    7. Spring提供了web应用开发的一整套流程,不仅仅MVC,他们之间可以很方便的结合一起
  11. SpringMVC参数传递,转发跳转
    1. 处理器映射
      1. 方式1
        1. @RequestMapping("/welcome")
          public String index(String username){
          	return "index";
          }

           

      2. 方式2
        1. @RequestMapping("/welcome")
          public String index(@RequestParam String username){
          	return "index";
          }

           

      3. 方式3
        1. @RequestMapping("/welcome")
          public String index(@RequestParam(value="username",required=false) String username) {
          	return "index";
          }
    2. @RequestParam
      1. value:参数名称
      2. defaultValue:默认值
      3. required:是否必须
    3. @RequestMapping
      1. 标注在类定义处
      2. 标注在方法定义处
      3. 映射规则
        1. 通过请求URL进行映射
        2. 通过请求参数进行映射
          1. 若选择方法参数直接入参的话,方法入参名必须与请求中参数名保持一致
          2. 通过请求方法进行映射
            1. GET
            2. POST
    4. @RequestMapping(value="/welcome", method=RequestMethod.GET,params="username")

  12. 如何将模型数据传递给视图?

    1. ModelAndView
      • 包含视图信息和模型数据信息
      • 常用方法
        1. 添加模型数据
          1. ModelAndView addObject(String attributeName,Object attributeValue);
          2. ModelAndView addAllObjects(Map<String,?> modelMap);
        2. 设置视图
          1. void setView(View view);
          2. void setViewName(String viewName);
      1. 12.如何将模型数据传递给视图?
        (1)ModelAndView
        ①包含视图信息和模型数据信息
        ②常用方法
        1)添加模型数据
        a.ModelAndView addObject(String attributeName,Object attributeValue);
        b.ModelAndView addAllObjects(Map<String,?> modelMap); 
        2)设置视图
        a.void setView(View view);
        b.void setViewName(String viewName);

         

    2. Model

      1. 数据结构:Map类型
      2. 常用方法:添加模型数据
      3. Model.addAttribute(String attributeName,Object attributeValue);

      4. @RequestMapping("/index2")
        public String index2(String username,Model model){
        	logger.info("welcome username : " + username);
        	model.addAttribute(username);
        	User user = new User();
        	user.setUserName(username);
        	model.addAttribute(user);
        	return "index";
        }

         

      5. Model其实就是一个Map的数据结构,那么是否可以使用Map作为处理方法入参?
  13. InternalResourceViewResolver
    1. prefix
    2. suffix
    3. <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
      	<property name="prefix" value="/WEB-INF/jsp/"/>
      	<property name="suffix" value=".jsp"/>
      </bean>
      

       

  14. Spring的常用标签
    1. @ModelAttribute
      1. 不仅仅和从页面中获取对象的所有属性,而且可以将对象放入request当中
    2. @DateTimeFormat(pattern="yyyy-MM-dd")的使用
      • 设置对应日期属性的字符串格式
    3. 	/**
      	 * @ModelAttribute 不仅仅和从页面中获取对象所有属性,
      	 * 而且可以将对象放入request当中
      	 * @param user
      	 * @return
      	 * @ModelAttribute 的使用
      	 * @DateTimeFormat(pattern="yyyy-MM-dd")的使用
      	 */
      	@RequestMapping("/add")
      	public String add(@ModelAttribute("user") User user){
      		System.out.println(user.getUserName());
      		System.out.println(user.getPassWord());
      		System.out.println(user.getBirthday());
      		return "showuser";
      	}

       

  15. @ModelAttribute
    1. 不仅仅和从页面中获取对象的所有属性,而且可以将对象放入request当中
  16. @DateTimeFormat(pattern="yyyy-MM-dd")的使用
    1. 设置对应日期属性的字符串格式
  17. Struts2和Springmvc的对比
    1. Struts2 中 result
    2. 字符串 一个对应一个 View视图
    3. springmvc 对于跳转这件事,简化!(不用配置,可以使用字符串自动跳转)
    4. 但是如果路径特别深,需要 "视图解析器",在spring-servlet.xml中配置
    5. 除去了前缀,后缀,使用ModelAndView,将视图页面和对象放到ModelAndView对象当中,实现跳转功能
    6. Struts2底层实现是过滤器,Springmvc底层是servlet
  18. 页面跳转的多种方式
    1. 使用字符串:forward:/页面全名称
      1. 转发到对应的页面:
        return "forward:/welcome.jsp";
    2. 使用视图解析器

      1. 路径特别深,需要 "视图解析器",在spring-servlet.xml中配置
        return "admin/wel";
        相当于:
        return "forward:/WEB-INF/jsp/admin/wel.jsp";

         

    3. 重定向到指定路径,可以是互联网上的任意地址:redirect:网址
      1. return "redirect:http://www.baidu.com";

         

    4. 使用ModelAndView设置跳转位置
      1. ModelAndView mv = new ModelAndView();
        mv.setViewName("admin/wel");
        return mv;

         

  19. 使用REST风格
    1. REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
      1. @RequestMapping(value="/view/{id}", method=RequestMethod.GET)
        public String view(@PathVariable String id,Model model){
        	//......中间代码省略
        }

         

  20. pringmvc文件上传
    1. MultipartResolver接口
      1. ①用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作
    2. 两个实现类
      1. StandardServletMultipartResolver
        1. 使用了Servlet3.0标准的上传方式
      2. CommonsMultipartResolver
        1. 使用了Apache的commons-fileupload来完成具体的上传操作
  21. 文件上传的实现步骤
    1. 导入jar文件
      1. commons-io-2.4.jar
      2. commons-fileupload-1.2.2.jar
    2. 配置MultipartResolver(springmvc-servlet.xml)
      1. 使用CommonsMultipartResolver配置一个MultipartResolver解析器
      2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons. CommonsMultipartResolver">
            <property name="maxUploadSize" value="5000000"/>
            <property name="defaultEncoding" value="UTF-8"/>
        </bean>

         

      3. <!-- 处理文件上传 -->
        <bean id="multipartResolver"
        	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        	<property name="defaultEncoding" value="gbk" /> <!-- 默认编码 (ISO-8859-1) -->
        	<property name="maxInMemorySize" value="10240" /> <!-- 最大内存大小 (10240) -->
        	<property name="uploadTempDir" value="/upload/" /> <!-- 上传后的目录名 -->
        	<property name="maxUploadSize" value="-1" /> <!-- 最大文件大小,-1为无限止(-1) -->
        </bean>
    3. 编写文件上传表单页
      1. method="POST" enctype="multipart/form-data" 指定表单内容类型,支持文件上传
      2. <input type="file" name="file"/> 用来上传文件的file组件
      3. <form action="upload.action" method="post" enctype="multipart/form-data">
        	姓名:<input type="text" name="name" /> 
        头像:<input type="file" name="file" />
        	<input type="submit" />
        </form>

         

  22. 文件上传中的业务流程

  23. 使用上传类,方法
    1. MultipartFile
      • Spring MVC会将上传文件绑定到MultipartFile对象中,并通过该对象完成文件的上传操作
    2. 提供的方法
      • CommonsMultipartFile类实现:MultipartFile接口
  24. 文件上传中需要注意的细节
    1. File.separator
      • Windows、Linux自适应路径分隔符
    2. 低入侵性的代码实现
    3. 必须对上传文件进行重命名
      • 原因
        1. 原文件名存在中文 乱码问题
        2. 原文件名与服务器上已有文件重名 覆盖问题
      • 重新定义上传文件名(保证不重名)
        1. 当前系统时间+随机数+“_Personal.jpg”
    4. 上传位置:
      • 指定磁盘路径
    5. 文件上传成功后
      • 获取文件上传 文件的url访问地址
      • 页面展示该文件,并可以对该文件进行下载。
  25. Springmvc处理AJAX请求
    1. 相关jar包:
      • jackson-all-1.8.10.jar
      • fastjson-1.2.47.jar(阿里巴巴)
    2. 以上两个jar包都可以处理AJAX请求
  26. 在控制器中增加方法
    1. 使用注解:@ResponseBody
      • 该注解设置返回值为JSON类型
    2. @ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
  27. 使用对象返回,Json自动解析
    1. @RequestMapping(value="/byid2")
      public @ResponseBody User findById2(int id){
      	User user = new User();
      	user.setId(id);
      	user.setName("小霞");
      	user.setPhone("188");
      	//这里可以使用JSON工具转换为字符串
      	return user;
      }

       

    2. 需要jackson-all-1.8.10.jar包,否则无法解析该类对象
  28. 接收JSON类型的对象
    1. 创建一个Controller方法
    2. 该方法的参数上必须加上注释“@RequestBody”
      1. @RequestMapping("/receive")
        public void receive(@RequestBody String name){
        	String str = "welcome "+name;
        	System.out.println(str);
        }
    3. 注意:

      1. @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象
      2. 用 JSON.stringify(data)的方式就能将对象变成字符串
    4. <script type="text/javascript">
      	function sendJson(){
      	//创建对象
      	var user={
      				name:"lisa",
      				age:22,
      				phone:18898472345
      	}
      	// 把JS当中的对象转换成为字符串
      	// 1、jquery.param name="小丽"&phone="110"&age=20
      	// 2、json字符串
        // 3、在Controller中需要接收一个JSON的字符串,不能直接接收JSON对象
      	var str = JSON.stringify(user);
      	$.ajax({
      		type:"post",
      		url:"receive2.action",
      		contentType:'application/json;charset=utf-8',
      		data:str,
      		success: function(data){
      			$("#h").html(data);
      	      }
      	});
      }</script>

       

    5. Controller中处理
    6. @RequestMapping("/receive2")
      public @ResponseBody String receive2(@RequestBody User user) {
      	String str =user.getName();
      	System.out.println(str);
      	return str;
      }

       

  29. 解决中文乱码问题:
    1. /*
       * 中文乱码问题得到解决
       * 原理: 手动给对应的Accept返回制定格式编码数据。
       * 发现produces设置多个Accept只有第一个的charset是有用的,
       */
      @RequestMapping(value = "/receive3", produces={"text/html;charset=UTF-8;","application/json;"})
      public @ResponseBody String receive3(@RequestBody String name) {
      	String str = "welcome " + name;
      	System.out.println(str);
      	return str;
      }

       

  30. 将集合转换成为一个JSON类型的字符串
    1. @RequestMapping(value="/receive3",produces={"text/html;charset=UTF-8;","application/json;"})
      public @ResponseBody String receive3(@RequestBody String name){
      	String str = "welcome : "+ name;
      	List<User> list = new ArrayList<>();
      	list.add(new User("zs",12));
      	list.add(new User("ls",13));
      	list.add(new User("ww",14));
      	list.add(new User("zl",15));
      // 使用阿里巴巴的fastjson.jar
      	return JSONArray.toJSONString(list);
      }

       

  31. 在JS当中,将JSON格式的字符串转换成为一个JSON对象
    1. $.ajax({
      	type:"post",
      	url:"receive3.action",
      	data:n,
      	contentType:'application/json;charset=utf-8',
      	success:function(data){
      		// 返回响应的字符串,需要转换成为JSON对象
      		console.log(data);
      		$("#s").html(data);
      		var json = JSON.parse(data);
      		var html = "";
      		$.each(json,function(i,item){
      			html += "<li><span>"+i+"</span>"
      			html += "<strong>"+item.name+"</strong></li>";
      		})
      		$("#d").html(html);
      	}
      });

       

  32. Springmvc拦截器
    1. 概念:
      • Spring Web MVC的处理器拦截器
      • 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
    2. 常见的应用场景
      • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
      • 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
      • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
      • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
      • OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。
  33. Springmvc拦截器和过滤器的区别
  34. 拦截器的配置
    1. 在Springmvc-servlet.xml中增加
    2. <!-- 拦截器 -->      
      <mvc:interceptors>      
          <!-- 多个拦截器,顺序执行 -->      
          <mvc:interceptor>      
             <mvc:mapping path="/entryOrJsonController/*" />      
             <bean class="com.wy.interceptor.CommonInterceptor"></bean>      
          </mvc:interceptor>      
      </mvc:interceptors>  

       

  35. 创建拦截器
    1. package org.springframework.web.servlet;  
      public interface HandlerInterceptor {  
          boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)   
                  throws Exception;  
        
          void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)   
                  throws Exception;  
        
          void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)  
                  throws Exception;  
      }   

       

  36. 开发步骤
    1. 创建Interceptor,实现:HandlerInterceptor接口
      • 注意:
        1. HandlerInterceptor的包:org.springframework.web.servlet
        2. preHandle方法必须返回true否则不能继续
        3. return true;
    2. 配置springmvc-servlet.xml
      • <mvc:interceptors>
        	<bean class="cn.smbms.interceptor.MyInterceptor"></bean> <!-- 拦截所有springmvc的url! -->
        </mvc:interceptors>

         

  37. 多个拦截器的执行顺序

觉得有点用记得给我点赞哦!

这篇文章就到这里啦,如果觉得有收获的话,不妨给一个赞喔;文章中涉及的内容肯定是不全面的,欢迎大家评论区留言补充。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值