标签: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