什么是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/javaee
http://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的文件
控制层
@Controller
public class MyFirstController {
@RequestMapping("/hello")
public String myFirstController(){
System.out.println("请求收到,正在处理");
//如果没有视图解析器的话,这转发地址需要为/WEB-INF/success/success.jsp
return "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风格
@Controller
public 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风格后
@Controller
public 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异步请求,局部更新页面的技术。