当前位置:首页 > 标签
SpringBoot 14 Spring 2 SpringMVC 3 MyBatis 2 Linux 4 阿里云 13 宝塔 1 Docker 3 ElasticSearch 2 Redis 4 Shiro 0 Dubbo 0 Swagger 0 Thymeleaf 6 数据库 11 MySQL 11 外键 2 Gradle 1 Test 0 Tomcat 1 JavaWeb 7 Ajax 1 注解 3 css 2 报错 3 多数据源 1 Java基础 1 源码 2 Servlet 1 JSP 1 环境搭建 8 RabbitMQ 1 七牛云 1 Edit.md 1 图像识别 4 英语 2 Zookeeper 1SpringBoot中Controller返回路径问题
- 2020-04-15
- 173
- SpringBoot
### SpringBoot是如何根据路径寻址文件的
要想知道Controller中的返回路径究竟如何填写,我们就必须知道SpringBoot是如何解析我们写的路径的。
关于这部分内容,我们得首先从SpringMVC开始说起。
#### (1)SpringMVC中路径问题
熟悉SpringMVC的小伙伴都知道SpringMVC的基本访问流程,如何不熟悉的话可以参考我的这篇博客:xxx
#### (2)SpringBoot中解析路径
和SpringMVC类似,我们也是需要找到他的视图解析器相关的配置文件。
`WebMvcAutoConfiguration`
`ResourceProperties`
这类配置文件再SpringBoot中一般是xxxProperties.java 的格式;所以我们找到 `ThymeleafProperties.java`
在这个类里面我们可以很清楚的看到如下代码:
```
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
// 剩余代码...
}
```
是不是有种似曾相识的感觉,这里的 prefix = "spring.thymeleaf" 表示我们在 application.yaml 文件中进行相关的配置,需要以 spring.thymeleaf 开头。
接下来有3个常量:
- DEFAULT_ENCODING 设置了一下Thymeleaf的默认编码
- DEFAULT_PREFIX 设置了解析时的前缀
- DEFAULT_SUFFIX 设置了解析时的后缀
就是说如果我们在Controller中直接返回一个字符串,例如 return "main";
那么SpringBoot就会去 templates/static 目录下面去寻找以 main 开头, .html 结尾的文件,也就是去寻找 main.html 文件。
#### (3)关于重定向
如果在Controller中需要重定向,那么在开头尽量添加上 / ,避免出现不必要的麻烦,因为 / 代码根目录。
如果不加的话,而且在Controller类上面又添加l @ ResponeBody 注解,如下所示,可能出现资源找不到情况。
```
@Controller
@RequestMapping("/admin")
public class BlogController {
@RequestMapping("/addBlog")
public String addBlog() {
return "redirect:/admin/Blog";
}
}
```
- 如果是 `return "redirect:/admin/Blog";` 那么地址栏将会显示 http://localhost/admin/Blog
- 如果是 `return "redirect:admin/Blog";` 那么地址栏将会显示 http://localhost/admin/admin/Blog 前面多了一个 amdin,就是因为我们在类上面添加了 @ RequestMapping("/admin") 造成的原因
#### (4)关于部署到服务器上(本地可以运行,服务器上报500错误)
##### 1. 部署到服务器上的时候, return 语句前面不需要加上 /,否则会报错
```
@RequestMapping("/Blog")
public String blog(Model model) {
// 逻辑代码
return "main/blog";
}
```
- 如上面代码所示,直接返回 "main/blog" 就行了,如果返回 "/main/blog" 就或报错
##### 2. 需要严格的遵守Thymeleaf的相关规范
**例如,使用Thymeleaf抽取公共页面时,前面也不能加 /
**
```
<!-- 文章页面:头部导航栏-->
<div th:replace="~{common/commonsfile::article-topbar}"></div>
```
- 第一个common前面不能加 /
SpringBoot项目中Ajax详解,结合@RequestBody和@ResponseBody
- 2020-04-14
- 183
- SpringBoot
### 基本介绍
@ ResponseBody 和 @ RequestBody 经常在 Controller 层中使用,今天就结合Ajax来详解的介绍一下这两个注解。
#### @ RequestBody 用在参数前面
#####(1)前端Ajax传递的是JSON字符串
当前端发送的Ajax请求是传递的数据data是一个**JSON字符串**时,后端 Controller 层就可以使用 **@ ResponseBody** 注解结合 **Map** 来接收参数。
> 前端
```
var inputTextObj = {
"text": inputText
};
$.ajax("/admin/tagGetSearchResult", {
type: 'post',
dataType: 'json',
data: JSON.stringify(inputTextObj), //转换为字符串
contentType : "application/json", // 记得加上这个
});
```
> 后端
```
@RequestMapping("/tagGetSearchResult")
@ResponseBody
public String getSearchResult(@RequestBody HashMap<String, String> map) {
String inputText = map.get("text"); // 获得Map里面的值(inputText)
List<Tag> tags = tagService.queryLike(inputText);
String str = JSON.toJSONString(tags);
return str;
}
```
#####(2)前端Ajax传递的是JSON对象
如果发送的Ajax的data是JSON对象,则后端可以直接使用 @ RequestParam 注解来接收参数,不需要使用 @ ResponseBody
> 前端
```
var dataObj = {
"title": $('#article-title').val(),
"blogid": tempBid,
"my-editormd-markdown-doc": $("#my-editormd-markdown-doc").text(),
"type": $('#my-type').val(),
"original": original + '',
"ifComment": ifComment + '',
"tag": tagNames, // 标签名称
"published": '0',
};
$.ajax("/admin/updateBlog", {
type: "POST",
data: dataObj, // 注意:这里传递的是一个 json 对象,后端需要利用 @RequestParam 注解
dataType: "text", // 返回的类型为纯文本字符串类型
traditional: true,
});
```
> 后端
```
@RequestMapping("/updateBlog")
@ResponseBody
public String updateBlog(@RequestParam("blogid") String bid,
@RequestParam("title") String title,
@RequestParam("my-editormd-markdown-doc") String bcontent,
@RequestParam("type") String typeName,
@RequestParam("original") String orginal,
@RequestParam("ifComment") String ifComment,
@RequestParam("tag") String[] tags,
@RequestParam("published") String published) {
// 逻辑代码...
}
```
#### @ ResponseBody 用在方法前面
表示直接返回一个字符串,处理Ajax请求时,如果后端查询出来的是一个 List 集合,那么可以转换为 JSON 字符串,结合 @ ResponseBody 返回。
- 具体可以看上面第(1)小点的后端代码
- 上面的 `JSON.toJSONString(tags);` 的 JSON 是使用的阿里巴巴的 FastJson,需要导入对应的依赖,如下:
```
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
```
SSM项目整合
- 2020-03-21
- 148
- SSM
## 1. SSM 项目整合时遇到的问题
#### ==**(1) "通配符的匹配很全面,但无法找到元素 XXXXX"**==
<img src="Images\image-20200314115528515.png" alt="image-20200314115528515" />
- 很可能是 Spring 的 xml 文件配置有问题,检查开头的 那几个地址,看是否有问题
> 解决办法,开头的地址做到一一匹配即可
>
#### ==**(2)Failed to obtain JDBC Connection**==
- 很可能是网络的原因或者这是 jdbc 的 url 的问题
> (1)修复网络问题,使得能连上互联网
>
>
> (2)URL 中的 useSSL 改为 false
>
#### **==(4) java.lang.NoClassDefFoundError java.lang.ClassNotFoundException==**
- 很可能是添加了新的依赖之后,没有将对应的 jar 包添加的 WEB—INF的 lib 目录里面
> 重新添加一次,将所有的 jar 包添加的 WEB-INF 的 lib 目录里面
>
#### (4) JDBC 更新数据失败
- 很可能是由于更新的时候忘记传递 id 属性了,导致找不到对象
> 可以利用隐藏域解决,在传递参数时同时传递id,但是用户不需要看到
(5)静态资源不能输出到 out 目录
- 还不知道是什么原因,但是在 pom.xml 中配置静态资源过滤时需要做一定的修改,改为false就行
```xml
<filtering>false</filtering>
```
(6)文件编码问题
说明创建的 xml 文件编码有问题,需要全部设置为 utf-8
### 2. 原生 Servlet 项目