1.Spring MVC概述:
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核心是两个核心:
处理器映射:选择使用哪个控制器来处理请求
视图解析器:选择结果应该如何渲染
通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。
2.SpringMVC运行原理
(2) 寻找处理器 :由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3) 调用处理器 :DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果 :Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型 : DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(8) Http响应 :视图负责将结果显示到客户端。
1.添加Web.xml配置文件中关于SpringMVC的配置
<!--configure the setting of springmvcDispatcherServlet and configure the mapping-->
<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>/</url-pattern>
</servlet-mapping>
2.在src下添加springmvc-servlet.xml
配置文件
3. 在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!--扫描注解包的范围--> <context:component-scan base-package="C"/>
<mvc:default-servlet-handler /> <!-- 开启mvc注解 --> <mvc:annotation-driven /> <!-- 视图解决方案 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean></beans><!--开启默认servlet-handler-->
hello.jsp
4. 建立Controller包
@Controller @RequestMapping("/mvc") public class MVCController { @RequestMapping("/index") public String hello(){ return "hello"; }}
http://localhost:8080/项目名/mvc/index即可访问hello.jsp
4.Spring MVC常用注解
@Controller
负责注册一个bean 到spring 上下文中。
@RequestMapping
注解为控制器指定可以处理哪些 URL 请求。
其中参数常见有以下两个
@RequestMapping(value = "/upload",method = RequestMethod.POST)一个代表URl请求,第二个代表提交方式(Get方式提交得意作为另个一方法进行重载)
@RequestParam
在处理方法入参处使用 @RequestParam
可以把请求参 数传递给请求方法。
public class User { private String name; private String pwd; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }在 Controller里编写方法
@RequestMapping(value = "/register",method = RequestMethod.POST) public String register(User user){ System.out.println(user.getName); return "index"; }6、参数传递
@RequestMapping(value = "/register",method = RequestMethod.POST) public String register(User user, RedirectAttributesModelMap redirectAttributesModelMap){ redirectAttributesModelMap.addFlashAttribute("user",user); return "redirect:index";//redirect:代表重定向 }
@RequestMapping(value = "/register",method = RequestMethod.POST) public String register(User user, ModelMap modelMap){ modelMap.addAttribute("user",user); return "redirect:index"; }那么就存在一个问题,ModelMap和重定向一定不能共存吗?
@SessionAttributes("user") public class MVCController {此注解的作用是把 ModelMap中键为user的作用域提升到session,并且在request作用域中仍然存在
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码,它有三个值
1.application/x-www-form-urlencoded:表单数据被编码为名称/值对。这是默认的编码方式(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。使用get方式提交时,把表单数据(name1=value1&name2=value2...)以键值对append到url后,用 '?' 分割url和参数。使用post方式提交时,把表单数据以键值对放在请求体中传输。
2.multipart/form-data:表单数据被编码为一条消息,页上的每个<input>对应消息中的一个部分,用boundary=--------36243265420146"分割各个部分(boundary值由浏览器生成)。它不会对字符进行编码, 一般用于传输二进制文件<form method="post" enctype="multipart/form-data">
@RequestMapping(value = "/upload",method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile file) throws IOException { String fileName=file.getOriginalFilename(); file.transferTo(new File("F:\\upload",fileName)); return "redirect:list"; }而下载时,要先设置respone的头部
@RequestMapping("/download") public void download(String fileName, HttpServletResponse response) throws IOException { //添加报文头,只有在报文里添加了"Content-disposition", "attachment; filename="打开文件的时候就会以下载文件的形式弹出, //response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。 // 例如web浏览器就是通过MIME类型来判断文件是GIF图片。通过MIME类型来处理json字符串。 response.addHeader("Content-Disposition","attachment;filename="+fileName); response.setContentType("application/octet-stream"); OutputStream out=response.getOutputStream(); InputStream in=new FileInputStream(new File("F:\\upload",fileName)); IOUtils.copy(in,out); out.close();//out要从in中获得数据,就是依赖于in,所以要求out先关闭 in.close(); }