标签:new 利用反射 jsp 流程 数据 character false input property
SpringMVC通过Spring实现web模块,简化web开发
SpringMVC通过一套MVC注解,让POJO(Plain Ordinary Java Object)成为处理请求的控制器,而无需实现任何接口
支持REST风格的URL请求
Model:模型,封装和映射数据
View:视图,页面显示工作
Controller:控制器,控制整个网站的跳转逻辑(Servlet)
运行流程:
客户端点击连接发送 http://localhost:8080/mvctest/hello
来到tomcat服务器
SpringMVC前端控制器收到所有请求
比较请求地址和哪个@RequestMapping标注匹配,决定使用哪个类的哪个方法来处理请求
前端控制器找到目标处理器类和目标方法,直接利用反射执行目标方法
方法执行完成后有一个返回值,用视图解析器拼接得到完整页面地址
拿到页面地址,前端控制器帮我们转发到页面
底层知识:
DefaultServlet是tomcat中处理静态资源(处了jsp和servlet外都是静态资源)的,DefaultServlet的url-pattern=/
如果DispatcherServlet(前端控制器)的url-pattern=/,则将覆盖掉DefaultServlet
jsp能访问是因为没有覆盖服务器中的JspServlet的配置
JspServlet的url-pattern如下
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
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_4_0.xsd" version="4.0"> <!--定义SpringMVC前端控制器--> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 如果不指定配置文件位置,默认找 /WEF-INF/前端控制器名-servlet.xml 文件 --> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> <!-- load-on-startup服务器启动的时候创建对象,值越小优先级越高,越先创建对象--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <!-- /和/*都是拦截所有请求 /*范围更大,还会拦截 *.jsp 请求,一旦拦截jap页面就不能显示 /不会拦截 *.jsp 请求,能保证jsp访问正常 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
dispatcher-servlet.xml
<?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"> <!--扫描所有组件--> <context:component-scan base-package="com.tang"></context:component-scan> <!--配置一个视图解析器,能帮我们拼接页面--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="hello">hello</a> </body> </html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>成功</title> </head> <body> 访问成功 </body> </html>
FirstController.java
package com.tang.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //@Controller标识表示这是一个控制器,可以处理请求 @Controller public class FirstController { //@RequestMapping告诉SpringMVC这个方法用来处理什么请求,这个/可以省略,默认从当前项目下开始,但习惯加上比较好 @RequestMapping("/hello") public String hello(){ //通过视图解析器帮我们拼接 //拼接后:/WEB-INF/pages/success.jsp return "success"; } }
在控制器的类定义及方法定义处都可标注
标注在类定义处相当于为方法路径指定了基本路径
参数
method:限定请求方式(GET、POST等)
method=RequestMethod.POST 表示只接收post请求
params:规定请求参数
params={"username"} 表示发送请求的时候必须带上一个名为username的参数
params={"!username"} 表示发送请求的时候不能带上一个名为username的参数
headers:规定请求头
consumes:规定请求头中的Content-Type,表示只接收哪种内容类型的请求
produces:给响应头中加上Content-Type,告诉浏览器返回的内容类型
支持模糊匹配
Ant风格资源地址支持3种匹配符:
?:匹配文件名中的一个字符
*:匹配文件名中任意字符
**:匹配多层路径
@PathVariable获取路径上的占位符
@RequestMapping("/delete/{id}"} public void delete(@PathVariable("id") Integer id) { UserDao.delete(id); }
REST:目的是以更简洁的URL地址来发送请求,以区分请求方式的方法来表示对同一个资源的增删改查
@RequestParam
@RequestHeader
@CookieValue
默认方式获取请求参数:直接给方法加上一个和请求参数同名的形参来接收,若请求没带参数,则形参值为null
注解方式获取请求参数:@RequestParam
@RequestParam:获取请求参数,使用该注解默认必须带参数(可以更改)
属性
@RequestParam(value="username", required=false, defaultValue="") String username 等同于 String username = req.getParameter("username");
属性
@RequestHeader("User-Agent") String userAgent
属性
@CookieValue("JSESSIONID") String jid
SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性
@RequestMapping("/book") public String addBook(Book book) { System.out.println(book); return "success"; }
SpringMVC的Handler方法可以接收的原生API:
注意:要放在其他Filter之前
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- encoding指定解决POST请求乱码问题--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!-- forceEncoding顺便解决响应乱码问题 response.setCharacterEncoding(this.encoding); --> <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>
Model
Map
ModelMap
都存放在请求域中
最终都是BindingAwareModelMap在工作
ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
@SessionAttributes:只能标注在类上,将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
@ModelAttribute:标注于方法上,这个方法就会比目标方法先运行,于是,可以在目标方法执行前先保存需要的数据,然后在目标方法参数上标注该注解即可取得保存的数据
@RequestMapping("/hello") public ModelAndView hello() { ModelAndView mv = new ModelAndView("success"); mv.addObject("msg", "你好"); return mv; }
标签:new 利用反射 jsp 流程 数据 character false input property
原文地址:https://www.cnblogs.com/tang321/p/14655237.html