springmvc

文章目录

前言

springmvc

组件及请求执行流程

请求执行流程

springmvc
第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler

     可以根据xml配置、注解进行查找

第三步:处理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

     ModelAndView是springmvc框架的一个底层对象,包括Model和view

第八步:前端控制器请求视图解析器去进行视图解析

     根据逻辑视图名解析成真正的视图(jsp)

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染

     视图渲染将模型数据(在ModelAndView对象中)填充到request域

第十一步:前端控制器向用户响应结果

案例的执行流程
springmvc

组件

1、前端控制器DispatcherServlet(不需要程序员开发)

作用接收请求,响应结果,相当于转发器,*处理器。

有了DispatcherServlet减少了其它组件之间的耦合度。

2、处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的url查找Handler

3、处理器适配器HandlerAdapter

作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

4、处理器Handler(需要程序员开发)

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

5、视图解析器View resolver(不需要程序员开发)

作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)

6、视图View(需要程序员开发jsp)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)

配置

1 web.xml中设置 DispatcherServlet 并设置一个参数加载bean.xml配置文件(spring配置文件)

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:bean.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>

  </servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

2: 控制器handler类中使用注解将其配置为表现层的控制器

@Controller

@RequestMapping

1. RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
2. RequestMapping注解可以作用在方法和类上
1. 作用在类上:第一级的访问目录
2. 作用在方法上:第二级的访问目录
3. 细节:路径可以不编写 / 表示应用的根目录开始
4. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 /
3. RequestMapping的属性
1. path 指定请求路径的url
2. value value属性和path属性是一样的
3. mthod 指定该方法的请求方式
4. params 指定限制请求参数的条件
5. headers 发送的请求中必须包含的请求头

示例

/**
 * 控制器类
 */
@Controller
public class HelloController {
    /**
     * 入门案例
     */
    @RequestMapping(path="/hello")
    public String sayHello(){
        System.out.println("hello springmvc");
        return "success";
    }
}

请求参数绑定

我们都知道,表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
示例

<a href="account/findAccount?accountId=10">查询账户</a>
中请求参数是:
accountId=10
/**
 * 查询账户
 * @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
System.out.println("查询了账户。。。。 "+accountId);
return "success";
}

支持的数据类型

基本类型参数:

  • String 类型
  • POJO 类型参数
    包括实体类,以及关联的实体类
  • 数组和集合类型参数
    包括 List 结构和 Map 结构的集合(包括数组)

SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

使用要求

如果是基本类型或者 String 类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写)
如果是 POJO 类型,或者它的关联对象:
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型,有两种方式:
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值, 使用下标。
给 Map 集合中的元素赋值, 使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现。

解决中文乱码问题

在 web.xml 中配置一个过滤器
注意
在 springmvc 的配置文件中可以配置,静态资源不过滤:

<!-- location 表示路径, mapping 表示文件, **表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

特殊情况

出现特殊情况需要使用自定义类型转换器

常用注解

RequestParam

  1. RequestParam注解
  2. 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
  3. 属性
  4. value:请求参数中的名称
  5. required:请求参数中是否必须提供此参数,默认值是true,必须提供
/**
* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestParam(value="username",required=false)String name) {
System.out.println("aaaa");
System.out.println(name);
return "success";
}

RequestBody

  1. 作用:用于获取请求体的内容(注意:get方法不可以)
  2. 属性
  3. required:是否必须有请求体,默认值是true

/
**
* 接收请求
* @return
*/
@RequestMapping(path="/hello")
public String sayHello(@RequestBody String body) {
System.out.println("aaaa");
System.out.println(body);
return "success";
}

PathVaribale

  1. 作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
  2. 属性
  3. value:指定url中的占位符名称
  4. Restful风格的URL
  5. 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
  6. restful风格的URL优点
  7. 结构清晰
  8. 符合标准
  9. 易于理解
  10. 扩展方便

RequestHeader

  1. 作用:获取指定请求头的值
  2. 属性
  3. value:请求头的名称
@RequestMapping(path="/hello")
public String sayHello(@RequestHeader(value="Accept") String header) {
System.out.println(header);
return "success";
}

CookieValue

  1. 作用:用于获取指定cookie的名称的值
  2. 属性
  3. value:cookie的名称

ModelAttribute

  1. 作用
  2. 出现在方法上:表示当前方法会在控制器方法执行前线执行。
  3. 出现在参数上:获取指定的数据给参数赋值。
  4. 应用场景
  5. 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。

SessionAttribute

  1. 作用:用于多次执行控制器方法间的参数共享
  2. 属性
  3. value:指定存入属性的名称

响应数据与结果视图

返回值分类

字符串

void

我们知道 Servlet 原始 API 可以作为控制器中方法的参数:

@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response)
throws Exception {
}

ModelAndView

存入ModelAndView的数据是存入
requestScope 中

转发和重定向

1:可以使用request 和 response
2:使用springmvc的快捷方式

return "forward:/WEB-INF/pages/success.jsp";
return "redirect:testReturnModelAndView";

ResponseBody响应json数据

使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。
前置知识点:
Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入
jackson 的包。

@Controller("jsonController")
public class JsonController {
/**
* 测试响应 json 数据
*/
@RequestMapping("/testResponseJson")
public @ResponseBody Account testResponseJson(@RequestBody Account account) {
System.out.println("异步请求: "+account);
return account;
}
}

其它

文件上船

异常处理

springmvc中的拦截器

上一篇:springMVC中参数接收


下一篇:SpringMVC--@RequestMapping注解以及SpringMVC获取请求参数