SpringMvc

SpringMvc


视频学习地址:https://www.bilibili.com/video/BV1Ry4y1574R?p=13&spm_id_from=pageDriver(尚硅谷)

已看到第13集

web.xml配置文件

默认配置方式

在这里插入图片描述

因为使用了maven工程,所以bean配置文件要统一放在resources目录下

扩展配置方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ieFgpE0Y-1631287565011)(C:\Users\HJX\AppData\Roaming\Typora\typora-user-images\image-20210907131325603.png)]

控制器处理

在这里插入图片描述

使用配置文件扫描@Controller注解

在这里插入图片描述

配置打包方式

配置视图解析器

在这里插入图片描述

在这里插入图片描述

thymeleaf模板

在这里插入图片描述

将html模板设置为thymeleaf

tomcat配置

在这里插入图片描述

如果里面没有Artifact,去pom.xml文件看是否配置了war打包方式,配上war打包方式就可以了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看到第13集

applicationContext.xml文件位置

version:spring 4.3.6

官方:

Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.

Consider the following DispatcherServlet Servlet configuration (in the web.xml file):

Maven 支持“物料清单”(BOM)依赖的概念

使用 Maven 时可能会意外混合不同版本的 Spring JAR。例如,您可能会发现第三方库或另一个 Spring 项目将传递依赖项引入到旧版本中。如果您忘记自己显式声明直接依赖项,则可能会出现各种意外问题。

为了克服这些问题,Maven 支持“物料清单”(BOM)依赖的概念。您可以spring-framework-bom在您的dependencyManagement 部分中导入以确保所有 spring 依赖项(直接和可传递的)都处于同一版本。

<dependencyManagement> 
    <dependencies> 
        <dependency> 
            <groupId> org.springframework </groupId> 
            <artifactId> spring-framework-bom </artifactId> 
            <version> 4.3.6.RELEASE </version> 
            <type> pom </type > 
            <scope> import </scope> 
        </dependency> 
    </dependencies> 
</dependencyManagement>

使用 BOM 的另一个好处是,<version> 当依赖 Spring Framework 工件时,您不再需要指定属性:

<dependencies> 
    <dependency> 
        <groupId> org.springframework </groupId> 
        <artifactId> spring-context </artifactId> 
    </dependency> 
    <dependency> 
        <groupId> org.springframework </groupId> 
        <artifactId> spring-web < /artifactId> 
    </dependency> 
<dependencies>

XML配置文件中xsi:schemaLocation有何作用

参考地址:
XML配置文件中xsi:schemaLocation

web.xml配置

参考地址:
web.xml配置

tomcat配置

tomcat环境变量配置:

tomgcat环境变量配置

IDEA 配置tomcat参考:

IDEA 配置tomcat参考

在这里插入图片描述

web.xml文件读取springmvc配置文件

1.启动tomcat后spring容器默认读取的配置文件默认是/WEB-INF/-servlet.xml这个配置文件,即跟你的servlet-name有关。

2.所以一般不用这个默认的规则,而是去自定义一个规则。

自定义配置如下:

注意:springmvc-servlet.xml文件即为类路径resources下的文件

<init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
        classpath:/springmvc-servlet.xml
      </param-value>
    </init-param>

Tomcat服务器restart和redeploy的区别

redeploy

是把当前的一个项目重新部署到Tomcat服务器上(一个Web项目)

restart

是Tomcat服务器的重启,服务器上可以部署很多的项目;restart的一部分效果是:把服务器上部署的所有项目重新部署一次,所以这部分效果的本质就是重新部署所有的Web项目;还有一部分效果是对Tomcat的相关配置文件进行刷新。
所以一般选择重启服务器。

踩坑

1.IDEA服务器启动默认会访问webapp目录下的静态文件,这里是index.jsp

在这里插入图片描述

2.如果直接在springmvc-servlet.xml配置文件中配置html文件,是会访问不到html资源的,如下:

经过实验,这种配置只能用于jsp页面的配置,html页面还需要添加其他的配置

<bean id="viewResolver" 				 class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/template/"></property>
        <property name="suffix" value=".html"></property>
    </bean>
    
    因为这里是html页面,所以会导致处理器拦截过后返回的页面访问不到(即出现404的情况),后面尝试改成jsp就可以访问了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yzZ8698c-1631287565015)(C:\Users\HJX\AppData\Roaming\Typora\typora-user-images\image-20210908105944886.png)]

spring AOP踩坑

aspectjweaver.jar的包:

它的主要作用是负责解析切入点表达式。

1.问题:Aop报错ProceedingJoinPoint is only supported for around advice

解决办法:

报错原因:是因为ProceedingJoinPoint只能在around(即环绕增强可以,其他增强不行)。

改用 JoinPoint 即可解决。

2.error at ::0 can’t find referenced pointcut myPointCut

另一个问题:

解决办法:
在这里插入图片描述

在这里插入图片描述

spring mvc返回json

利用spring mvc3的注解@ResponseBody

参考网址:

返回json

然后使用spring mvc的默认配置就可以返回json了,不过需要jackson的jar包哦。

注意:当springMVC-servlet.xml中使用<mvc:annotation-driven />时,如果是3.1之前已经默认注入AnnotationMethodHandlerAdapter,3.1之后默认注入RequestMappingHandlerAdapter只需加上上面提及的jar包即可!(即jackson-mapper-asl-*.jar包)(经测,这种方法失败)

出现的bug:

1.页面上返回了json格式,但是返回404。

解决办法:在controller类中的处理方法上面加上@ResponseBody注解。

2.成功返回json格式,控制台也成功打印出了查询的数据。但是页面的数据出现乱码(即???)

解决办法:

可以看到返回的类型为:

在这里插入图片描述

通过在@RequestMapping注解中设置属性produces没有成功。(浏览器页面的编码方式以及返回格式设置不起作用),现在还没有解决问题。

3.Http状态码406(Not Acceptable) 错误问题解决方法

参考地址:

Http状态码406

状态码406:HTTP协议状态码的一种(4xx表示客户端的问题),表示客户端无法解析服务端返回的内容。说白了就是后台的返回结果前台无法解析就报406错误。

在这里插入图片描述

在这里插入图片描述

4.找不到’mvc:annotation-driven’ 的声明。

在这里插入图片描述

5.HTTP状态 415 - 不支持的媒体类型

6.java中list对象返回出现$符号,没有返回对应的值。

在这里插入图片描述

在这里插入图片描述

尝试将BookMessage存入list集合前转换为json,结果出现了反斜杠\

在这里插入图片描述

*目前还不知道为什么出现反斜杠*

详解@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

1、 value, method;

value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method: 指定请求的method类型, GET、POST、PUT、DELETE等;

设置请求的提交内容类型

2、 consumes,produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

3、 params,headers;

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

中文编码问题

在这里插入图片描述

将java对象转换为json格式

1.导入json包

/*版本不一定是这个*/
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>         
</dependency>

2.使用json函数

User user= new User();
		user.setId(1);
		user.setName("lzc");
		user.setPass("123");
		user.setSex("male");
		String json=JSON.toJSONString(user)

3.最后服务器返回json即可

4.结果:

在这里插入图片描述

application/json和text/json有什么区别?

application/json是标准写法。
text/json没有官方规定支持,但是很多各种框架都有对它的支持,相当于一个广泛山寨版本。

factId>fastjson
1.2.47


2.使用json函数

```java
User user= new User();
		user.setId(1);
		user.setName("lzc");
		user.setPass("123");
		user.setSex("male");
		String json=JSON.toJSONString(user)

3.最后服务器返回json即可

4.结果:

在这里插入图片描述

application/json和text/json有什么区别?

application/json是标准写法。
text/json没有官方规定支持,但是很多各种框架都有对它的支持,相当于一个广泛山寨版本。

注意事项

关于web.xml配置文件

//表示应用程序启动时会立即加载servlet
<load-on-starup>1</load-on-starup>
//
<init-parm>
	<param-name>contextConfigLocation</param-name>
	//表示加载指定位置的配置文件
	// 如果没有指定配置文件的位置,则默认加载WEB-INF目录下的servletName-servlet.xml    servletName是DispatcherServlet的名字(相当于jsp中控制器中的名字)
	<param-value>classpath:springmvc.config.xml</param-value>	
</init-parm>

重定向和转发

重定向

客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址
→ 服务器根据此请求寻找资源并发送给客户。
Controller中:return “redirect:a”

转发

转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户。(在服务器内部完成页面变化,浏览器地址不变)
Controller中:return “forward:b”

数据绑定

默认数据类型绑定

1.HttpServletRequest
2.HttpServletResponse
3.HttpSession
4.Model/ModelMap:Model:接口,ModelMap:是一个接口的实现,用于将数据填充到request域

说白了,就是这些数据类型的参数在Controller中是可以直接绑定的。只要提供这样一个参数就可以直接使用它

简单数据类型绑定

如:int,String,Double等

间接数据类型绑定

使用@RequestParam,如果只使用其value属性,则该value属性名可以省略,如下:
@RequestParam("name) String name

POJO类型绑定

简单说:就是将所有关联的请求参数绑定到一个java对象中。然后就可以直接调用该对象来获取对应的参数值了。如下:
public String Hello(User user); //直接将对象绑定在User这个对象中。

绑定包装POJO

这是对简单pojo包装类型的升级(如:请求参数中包含多个对象信息),这时我们可以采用一个对象中包含另外一个对象的方式获取复杂的请求参数。如下:

	public Class User{
	private int id;
	private String name;
	private Order order; //绑定包装POJO
	}
	// 获取参数时
	public String Hello(User user);通过get方法即可获取Order对象对应参数

自定义数据类型绑定

使用原因:比如要将字符串类的日期转换为不同格式的日期,就需要用到自定义数据类型绑定。使用如下:


数组绑定

适用于当有多个表单中name属性相同的时候,这时候可以用数组来进行接收。比如同时删除多个数据时。如下:

// 这里数组的元素是表单的值,而不是name的值
public String hello(String[] str)

绑定集合

因为后台不知使用集合形参进行数据绑定,所以需要使用POJO包装类将集合属性包装在该POJO里面。如下:

public class UserVO{
	private List<User> users;
	//set/get
}
//使用  这里的userList可以一次性接收多个User对象的参数
public String hello(UserVO userList){
	List<User> users=userList.getUsers();
	//遍历
}

RESTful请求风格支持

简单说就是将请求参数变成请求路径的一种操作。具体如下:

/**
原来:http://localhost/item?id=1
现在:http://localhost/item/1
*/
@PathVariable("id"):如果请求参数中的id和方法形参名称id一样,则@PathVariable("id")后面的 “("id")” 可以省略。



@RestController
public class TestController {
    @GetMapping(value = "/hello/{id}")
    public String hello(@PathVariable int id){
        return  "id="+id; //若id=1则返回id=1
    }
}

适用场景
在这里插入图片描述
如上述,比如最后一种:/tvseries/101/characters 如果通过以前那种请求方式是做不到的,这时候就可以通过restful风格实现(101作为动态参数,其余不变)

在这里插入图片描述
注意:适用{}的代表是动态参数

解决spring中文乱码

可以在web.xml中配置编码过滤器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值