首页 > 其他分享 >[SpringMVC]知识点

[SpringMVC]知识点

时间:2024-03-28 23:22:38浏览次数:26  
标签:知识点 控制器 请求 do SpringMVC query restful

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18032069
出自【进步*于辰的博客

目录

1、什么是SpringMVC?

1.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果大家想要深入学习SpringMVC,我暂未系统整理相关内容,大家可查阅博文《Spring MVC详解(学习总结)》(转发)。

1.2 示例

1、配置前端控制器。(web.xml)

<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:config/spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*.do</url-pattern><!--拦截请求配置-->
</servlet-mapping>

2;配置处理器映射器、处理器适配器。

<mvc:annotation-driven /><!--精简配置-->

3、配置视图解析器。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"> </property><!--前缀-->
    <property name="suffix" value=".jsp"></property><!--后缀-->
</bean>

会根据控制层方法返回的字符串查找相应的视图(如:jsp文件),prefix/suffix用于在前后进行拼缀,生成文件路径。

6、restful风格

参考笔记二,P10.3。

注:下文中“restful控制器”指使用了restful风格配置的控制器。

6.1 概述

常规请求方式:

https://www.vatapi.com/book/query.do?page=12&pageSize=20

restful风格请求方式:

https://www.vatapi.com/book/query/12/20

显而易见,restful风格的请求方式简洁、安全性高。(PS:谁知道哪个值对应哪个参数,代表什么意思)

要把常规请求方式转换成restful风格,需要三步:

  1. 在web.xml中把前端控制器url-pattern的值由/*.do改为/。(一般在修改成restful风格前,url-pattern的值是/*.do,表示拦截所有动态请求
    注:“拦截”指处理器映射器寻找控制器的过程。
  2. 在 @RequestMapper 中,在路径后加{a},比如上述的query.do,@RequestMapper 内的值是“query”,现在改成“query/{a}”;
  3. 在 @RequestMapper 注解的方法形参前加@PathVariable,用于映射参数值。

举个栗子:
在这里插入图片描述

那请求就是:

${pageContext.request.contextPath}/book/queryBySyllabusId/12

6.2 使用细节

1:关于第一步

拦截的路径在修改前是/*.do,表示只拦截以.do结尾的请求。(一般在请求后加.do,表示访问动态资源。比如login.do、query.do

将路径修改为/后,表示拦截所有请求,也包括类似login.do这样的动态资源请求。那问题来了,现在拦截路径是/,而请求是login.do,为什么处理器映射器还能找到@RequestMapper("login")这个控制器?

从SpringMVC的源码以及一些资料中得知:

SpringMVC在底层会排除掉login.do中的.do(后缀)。

2:关于请求数据封装机制

restful风格完全抛弃了SpringMVC的请求数据封装机制(映射封装),如上述:https://www.vatapicom/book/query/12/20中的12、20,并没有参数与其绑定,映射关系完全取决于控制器形参前@PathVariable注解内的值。

3:补充第一点

SpringMVC底层会排除掉请求后的后缀。因此,对于访问非restful控制器,在请求时加不加后缀.do都可行(不过,需要注意拦截器)。

因此,restful风格的配置不会影响其他非restful控制器,对于其他非restful控制器的访问不用修改。但是,需要注意的是,访问restful控制器时不能加后缀,如:

https://www.vatapi.com/book/query/12/20    √
https://www.vatapi.com/book/query/12/20.do    ×

4:关于静态资源的访问

关于静态资源配置,推荐一篇博文《SpringMVC访问静态资源 mvc:resources》(转发)。

由于restful风格的配置会拦截所有资源,也包括静态资源(如:image、css、js)。

https://www.vatapi.com/gd-book/28282718.jpg    // 找不到图片
https://www.vatapi.com/css/menu.css    // 找不到css,页面没有样式
https://www.vatapi.com/js/index.js    // 找不到js,页面没有功能

这样的请求是访问一张图片,但处理器映射器会把他当作一个对控制器的访问去寻找控制器,而不会去寻找图片,自然无法找到图片。因此,需要对静态资源做配置。:

<mvc:resources location="/static/" mapping="/static/**" />    // 举例

5:关于拦截器

在配置拦截器时,若拦截的是restful控制器,{}内不需要一致。
示例:

<mvc:mapping path="/commonQuestion/queryByQuestionId/{questionId}"/>

{questionId}内的questionId可任意名称。

扩展一点:(关于拦截器)
上文说道:

SpringMVC在底层会排除掉login.do中的.do(后缀)。

而拦截器不会,如:

<mvc:mapping path="/commonQuestion/query.do"/>

拦截的是请求/commonQuestion/query.do,而/commonQuestion/query不会被拦截。

7、自定义异常处理器

参考笔记二,P11.4。

为了便于捕获异常,可将异常抛给框架,交由异常处理器对象统一处理,这个“异常处理器对象”叫做“全局异常解析器”。

示例:
1、创建全局异常解析器。

public class ExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp,
                                         Object obj, Exception ex) {
        ModelAndView mv = new ModelAndView();
        // 添加日志
        ...
        return mv;
    }
}

2、注入IOC容器。

<bean class="com.neusoft.exception.ExceptionResolver"/>

当出现异常时(包括抛出异常),会自动调用resolveException(),参数ex是异常对象。

也可以自定义异常类,用于抛出异常。

8、自定义类型转换器

参考笔记二,P11.5。

SpringMVC具有很强大的数据封装机制,但并不是“万能”的。

如:使用JSP文件的<form>表单进行提交,除<input type="file">之外(输出类型是二进制),其他<input>都只有字符串和数字这两种。包括<input type="date">(输出日期字符串)。

而数据库相应字段是时间类型(一般这种情况实体属性也是时间类型),如此SpringMVC将无法对“时间”数据进行封装。因此,需要我们手动配置。

示例:
1、创建类型转换类。

public class DateConvert implements Converter<String, Date> {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date convert(String dateStr) {
        Date date = new Date();
        try {
            if (dateStr == null) {
                throw new Exception("时间为空,无法转换");
            }
            date = sdf.parse(dateStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }
}

2、配置类型转换器。

<bean id="conversionFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
	<property name="converters">
		<set>
			<bean class="com.neusoft.convert.DateConvert"></bean>
		</set>
	</property>
</bean>

<form>表单提交时,<input type="date">提交的“时间”字符串会自动传入dateStr,转换成 Date 进行数据封装。

最后

暂无言。

本文持续更新中。。。

标签:知识点,控制器,请求,do,SpringMVC,query,restful
From: https://www.cnblogs.com/cnb-yuchen/p/18032069

相关文章

  • [附源码]计算机毕业设计保险客户管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍在现代保险行业中,客户管理系统对于提升客户服务水平、增强客户满意度和构建长期客户关系至关重要。随着大数据和人工智能技术的发展,保险公司迫切需要一个先进的......
  • [附源码]计算机毕业设计技术文档管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍技术文档管理系统是企业信息化建设的重要组成部分,它关系到知识的积累、共享和管理效率。随着企业规模的扩大和业务的多样化,传统的文件管理方式已无法满足快速检......
  • 必备知识点 模版
    模版1.寻找html模版TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':[os.path.join(BASE_DIR,'templates')],'APP_DIRS':True,'OPTION......
  • 必备知识点 模型层ORM
    模型层ORM1.Django连接MySQL数据库1.1配置mysql参数#MySQL配置项DATABASES={'default':{#ENGINE:默认的引擎mysql'ENGINE':'django.db.backends.mysql',#HOST:主机地址127.0.0.1/localhost"HOST"......
  • 必备知识点 视图
    4.视图1.视图参数#urls.pyurlpatterns=[path('login/',account.login,name="login"),path('auth/',order.auth,name='auth'),]#views.pyfromdjango.shortcutsimportHttpResponsedeflogin(request):re......
  • 必备知识点 路由
    django必备知识点路由1.Django生命周期请求流程图浏览器>>发送请求(Http请求)>>web服务网关接口(django默认的wsgiref模块不能承受高并发,最大只有1000左右)>>中间件>>缓存数据库(返回给中间件已经缓存过的数据)>>urls.py(路由层)>>views.py(视图层)>>templates(......
  • SpringMVC对 Restful ⻛格请求⽀持
    rest⻛格请求是什么样的呢?RESTful⻛格URL:互联⽹所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。RESTful⻛格资源操作:使⽤HTTP请求中的method⽅法put、delete、post、get来操作资源。分别对应添加、删除、修改、查询。不过⼀般使⽤时还是post......
  • 软考中级软件设计师【结构化开发】知识点+题目
      一、耦合   耦合是模块之间的相对独立性(相互连接的紧密程度)的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等,有以下几个类型。   无直接耦合:指两个模块之间没有直接关系,它们分别属于不同模块的控制和调用,它们之间不......
  • Go Template 常用疑难知识点
    前段时间,在项目开发中经常和go语言的HTMLLtemplate打交道,特意总结了几点我在使用中经常遇到不太明确的,比较纠结疑惑的知识点,巩固一下,也方便以后查找。​ 至于关于gotemplate的系统性的介绍说明,这是一篇我经常查看的文章,写的非常全面。1、作用域访问​ gotemplate中最常打交......
  • salesforce零基础学习(一百三十五)项目中的零碎知识点小总结(七)
    本篇参考:https://trailhead.salesforce.com/content/learn/modules/flow-implementation-2/debug-flows-as-another-userhttps://developer.salesforce.com/docs/platform/lwc/guide/create-components-dom-work.html?q=ref#refshttps://developer.salesforce.com/docs/platfo......