什么是SpringMVC?
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
在Spring的Web MVC框架提供了模型 - 视图 - 控制器架构以及可用于开发灵活,松散耦合的Web应用程序准备的组件。 MVC模式会导致分离的应用程序(输入逻辑,业务逻辑和UI逻辑)的不同方面,同时提供这些元素之间的松耦合。
- 模型(Model )封装了应用程序的数据和一般他们会组成的POJO。
- 视图(View)是负责呈现模型数据和一般它生成的HTML输出,客户端的浏览器能够解释。
- 控制器(Controller )负责处理用户的请求,并建立适当的模型,并把它传递给视图渲染。
DispatcherServlet
SpringMVC 围绕 DispatcherServlet 设计, DispatcherServlet 的作用是==将请求分发到不同的处理器==。在 Spring 2.5 之后,支持使用 @Controller 注解来注册处理器
SpringMVC 以请求为驱动 , 围绕一个DispatcherServlet 分派请求及提供其他功能,DispatcherServlet 是一个实际的 Servlet ( 继承自 HttpServlet 基类 )
SpirngMVC工作流程
SpringMVC的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><display-name>springmvc</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!--前端控制器:拦截所有请求,并且智能分发--><servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--contextConfigLocation:指定springmvc的配置文件--><!--如果配置init-param,则需要在WEB-INF下配置[servlet-name]-servlet.xml的文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--servlet 启动是创建对象,值越低,优先级越高--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><!--拦截请求/*拦截所有请求/ 会拦截除*.jsp以外的请求,,如*.action,*.do,*.xx--><url-pattern>/</url-pattern></servlet-mapping></web-app>
url-pattern拦截请求
- /*:拦截所有请求
- / :会拦截除.jsp以外的请求,,如.action,.do,.xx
注:web.xml继承于defaultweb.xml
在defaultweb.xml中,/是默认配置静态资源(如:html等)
当web.xml中设置拦截请求为/时,会默认覆盖父类的xml,则在webapp下生成的静态资源,就无法访问,会默认认为是一个请求,被前端控制器拦截。
如
url-pattern
而jsp这种动态页面却不会被拦截,因为defaultweb.xml中有一个jspservlet,还单独的处理jsp页面,如果web.xml设置拦截请求为/*,则会覆盖父类的jspServlet。
Springmvc配置文件
<?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"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.xsd"><!--扫描所有组件--><context:component-scan base-package="com.springmvc"></context:component-scan><!--视图解析器,帮我们解析拼接页面--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/success/"></property><property name="suffix" value=".jsp"></property></bean></beans>
不指定SpringMVC配置文件
不指定配置文件,会默认在WEB-INF下寻找前端控制器-servlet.xml的配置文件
如果不指定配置配置,需要在WEB-INF下配置[servlet-name]-servlet.xml的文件
控制层
@Controllerpublic class MyFirstController {@RequestMapping("/hello")public String myFirstController(){System.out.println("请求收到,正在处理");//如果没有视图解析器的话,这转发地址需要为/WEB-INF/success/success.jspreturn "success";}}
跳转链接
<a href="hello">hello链接</a>
执行流程
- 点击链接,会发送地址http://localhost/8080/springmvc/hello
- 进入tomcat服务器
- 前端控制器获得请求
- 根据请求会从@RequestMapping标准的匹配
- 执行方法,视图解析器会返回的字符串拼接,封装成一个model
-
SpringMVC注解
@RequestMapping
作用:
告诉SpringMVC,这是来处理什么请求的
- /是可以省略的,默认是从当前项目开始的,即http://localhost/8080/springmvc/
RequestMapping参数
method:规定请求方式
- get、post等
parmas:规定请求参数
- parmas={‘xxx’}规定请求的参数,如果没有携带,这会报40x错误
headers:规定请求头参数
- 可以设置不同浏览器访问等
ant风格:RequestMapping可以指定相应的不同字符的路径
- ?:一个字符
- *:多个字符
**:多层路径
@RequestMapping("/hell*")
占位符:{}
用于获取路径上的路径名 ```java @RequestMapping(“user/{id}”) public String test01(@PathVariable(“id”) String id){ System.out.println(“路径上的占位符”+id); return “success”;
}
可以获取到{id}中的值<a name="RNvsS"></a>### RequestParam注解```java@RequestMapping("test")public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username){System.out.println("传入的参数"+username);return "success";}
如果不指定RequestParam,则处理请求函数参数要和表单参数同名,才能封装上。
RequestParam指定后,传入参数必须有值,如果没有,则指定不需要值。
RequestHeader注解
@RequestMapping("test")public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username,@RequestHeader("User-Agent") String userAgent){System.out.println("传入的参数"+username);System.out.println("请求头参数,浏览器为"+userAgent);return "success";}
获取请求头参数,RequestHeader参数和RequestParam相同。
CookieValue注解
@RequestMapping("test")public String test02(@RequestParam(value = "user",required = false,defaultValue = "") String username,@RequestHeader("User-Agent") String userAgent,@CookieValue("JSESSIONID") String cookie){System.out.println("传入的参数"+username);System.out.println("请求头参数,浏览器为"+userAgent);System.out.println("cookie的值"+cookie);return "success";}
POJO对象自动封装
当表单参数名和对象参数名匹配时,自动调用对象的set方法,将表单参数传入,甚至是级联参数也能匹配。
Servlet原生API
在SpringMVC中可以使用原生的API进行使用,常用的有三个HttpServletRequest、HttpServletRespone和HttpSession。
在jsp页面中相应的域中可以找到,响应之后的数据。
解决乱码问题
在Tomcat的server.xml,将8080端口的标签添加上URIEncoding=utf-8。
在web.xml配置编码过滤器
<!--解决乱码--><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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
数据输出
请求处理后,输出的数据在请求域中可以获取到。
@RequestMapping("test1")public String test03(Map<String,String> map){map.put("msg","map中的值");return "success";}
${requestScope.msg}

Model,ModelMap和ModelAndView中的数据均可以在请求域中获取到。
Map、Model和ModelMap之间的关系

继承关系,这三个类最后获得的类型都是BindingAwareModelMap,并且输出到请求域中。
转发和重定向
@RequestMapping("forward")public String test04(){return "forward:/hello.jsp";}@RequestMapping("redirect")public String test05(){return "redirect:/hello.jsp";}
转发是一次请求,所以可以携带参数;
重定向是两次请求,因此携带参数也无法被下个请求使用。
Restful风格
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
传统方式操作资源
http://127.0.0.1/item/queryUser.action?id=1 查询,GET
http://127.0.0.1/item/saveUser.action 新增,POST
http://127.0.0.1/item/updateUser.action 更新,POST
http://127.0.0.1/item/deleteUser.action?id=1 删除,GET或POST
使用Restful风格后,就变成了
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item/ 新增,POST
http://127.0.0.1/item/ 更新,POST
http://127.0.0.1/item/x 删除,GET或POST
这种以路径来实现对后端的访问。
实例
不使用Restful风格
@Controllerpublic class RestFulController {//http://localhost:8080/add?a=1&b=2@RequestMapping("/add")public String test1(int a,int b,Model model){int res=a+b;model.addAttribute("msg","结果为"+res);return "test";}}
使用Restful风格后
@Controllerpublic class RestFulController {//http://localhost:8080/add/a/b@RequestMapping("/add/{a}/{b}")public String test1(@PathVariable int a,@PathVariable int b, Model model){int res=a+b;model.addAttribute("msg","结果为"+res);return "test";}}
JSON
什么是 JSON ?
- JSON 指的是 JavaScript 对象表示法(_J_ava_S_cript _O_bject _N_otation)
- JSON 是轻量级的文本数据交换格式,JSON 比 XML 更小、更快,更易解析。
- JSON 独立于语言
- JSON 具有自我描述性,更易理解
JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
常用的JSON包有,jackson,gson,fastson
以jackson为例。
Ajax
Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新刷新加载整个页面的情况下。即通过js异步请求,局部更新页面的技术。
