文章目录
之前说过想做一个自己的网站,一开始考虑用python
做吧,然后思索再三还是考虑用java
来做,python
来做网站生态和java
比起来差距还是有点大的。然后每天回去一边学一边做,生怕忘记做到哪了,就顺手就做了一些记录,网站现在马马虎虎也算是基本有个样子出来了吧,功能都只写了个大概,后面还有很多东西要改,很多东西要学。
1、提示某个依赖不存在时:
比如刚安装的idea
,创建项目时没有勾选jdbc api
,在pom.xml
中配置依赖时报错找不到:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
先把上面的内容添加到pom.xml
中,然后右击项目,选择最后面的Maevn
,点击重新加载项目,然后就会自动下载这个包了。也可以自己下载依赖,放到路径下。
2、使用特殊字体:
直接从各大字体网站下载ttf
字体文件,放到项目的static
目录中后,就可以在css
中引入了,引入方式:
<style>
@font-face {
font-family: yangFont;
src: url('font-style/yangrendong.ttf');
}
</style>
使用时用class
:
.yangFont{
font-family:yangFont,serif;
}
也可以直接使用有字库的接口,地址:https://www.webfont.com/onlinefont/index/1
找到喜欢的字体点进去有现成的代码,贴过去就能看到效果了。不过使用一段时间后会收费。
<script type="text/javascript"
src="http://cdn.repository.webfont.com/wwwroot/js/wf/youziku.api.min.js">
</script>
<script type="text/javascript">
$webfont.load("body", "13911088238b4090a6208ec754ba1c3c", "LiDeBiao-Xing3");
/*$webfont.load("#id1,.class1,h1", "13911088238b4090a6208ec754ba1c3c", "LiDeBiao-Xing3");*/
/*...*/
$webfont.draw();
</script>
3、网址请求跳转:
创建indexController.java
:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class indexController {
@RequestMapping(value ="/home",method = RequestMethod.GET) //路径为home ,get方式执行以下函数
public String Home()
{
System.out.println("当前是home页面");
return "index"; //返回到index.html
}
@RequestMapping(value ="/article",method = RequestMethod.GET) //路径为article ,get方式执行以下函数
public String Article(ModelMap map)
{
return "article"; //返回到article.html
}
@RequestMapping(value ="/photoGraph",method = RequestMethod.GET) //路径为photoGraph ,get方式执行以下函数
public String Photo()
{
return "photoGraph"; //返回到photoGraph.html
}
}
@RequestMapping(value,method)
中的value
是网页地址,return
是地址关联的html
页面。如value="home"
、return "index"
就可以通过localhost:8080/home
访问index.html
了,后面不加地址就会默认访问index.html
。
4、加载页面时,给前端传值:
前提是添加了thymeleaf
依赖。
比如在index.html
添加下面代码,th
可能会红线提示错误,不管它:
<p th:text="${key1}"></p>
<div th:text="'key =' +${key2}"></div>
controller
中这样写:
import org.springframework.ui.ModelMap;
@RequestMapping("/home")
public String index(ModelMap map) {
map.addAttribute("key1","111");
map.addAttribute("key2","222");
return "index";
}
除了th:text
传值外,还有th:utext
可以进行传值,它们两个的区别在于text
只负责传递内容,而utext
能够解析里面的html
。比如:
<div th:text="'key = <br>' +${key}"></div>
<div th:utext="'key = <br>' +${key}"></div>
对key
传值1
。
text
输出为:
key = <br> 1
utext
输出为:
key =
1
5、不存在的页面返回404:
最查找方法看到的是这个版本:
@RequestMapping("*")
public String notFound(){
return "404"; //自己写的404页面
}
就是对所有没有映射到mapping
的网页都跳转到404
,但是这个只针对没有mapping
的一级后缀网页,比如对于localhost:8080/dhaj
可以返回404
页面,但是对于localhost:8080/dhaj/hjksahdj
和localhost:8080/dhaj/hsadjh/asjdhsaj
这种二级三级后缀的网页,如果不存在时就尾了。
后来通过404
的报错信息,看到提示这个页面是因为没有配置/error
页面的映射,那我就应该可以配置error
映射到自己定义的网页了,就不需要像上面那个一样去针对地址了,只要报错,我就返回到自定义的页面就行了。
但是不是直接@RequestMapping("error")
然后return
页面就可以的,后来在 https://www.cnblogs.com/yaoyuan2/p/11880375.html 找到了方法。
创建一个errorPageConfig
java
类:
package com.example.myblogweb.config;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class errorPageConfig implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
return "404"; //返回404页面,即自定义页面
}
@Override
public String getErrorPath() {
return "/error";
}
}
上面的代码中我是仍何错误都无脑返回同一个页面的,做细一点就可以通过HttpServletRequest request
判断错误类型来返回不同页面,并输出错误信息。
404.html
页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="source/eleCat.png" type="image/x-icon">
<title>Title</title>
</head>
<body>
<div th:utext="'错误码:'+${errCode}+'<br>'+'错误信息:'+${errMess}"></div>
</body>
</html>
errorPageConfig.java
:
package com.example.myblogweb.config;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class errorPageConfig implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request, ModelMap map) {
Integer errCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); //错误码
Exception errMess = (Exception) request.getAttribute("javax.servlet.error.exception"); //错误信息
map.addAttribute("errCode",errCode);
map.addAttribute("errMess",errMess);
return "404";
}
@Override
public String getErrorPath() {
return "/error";
}
}
当页面不存在返回404
错误时:
6、使用mysql数据库:
(1)配置数据库和jdbc:
首先要安装好mysql
,然后点击右边数据库:
然后加号选择数据源:
创建好数据源就填写用户名密码,主机中的数据库名,URL
右数据库服务端口+数据库名组成:
然后点击测试链接,可能会提示时区不对,把serverTimezone
改为Asia/Shanghai
:
再次测试,就成功了:
此时可以在加号下的查询控制台中使用sql
了:
要在java
中使用mysql
还要配置一下,在pox.xml
中添加mysql
和jdbc
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在application.yml
中添加配置,用户名密码我是按照刚刚数据库配置中写的填的:
spring:
datasource:
name: localhost
url: jdbc:mysql://localhost:3306/mydatabase #数据库端口,mydatabase是使用的数据库名
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
此时要在java
中使用数据库时首先在controller
中引入JdbcTemplate
,然后使用JdbcTemplate
控制数据库了。
(2)使用JdbcTemplate:
- 查询某一个属性时,可以像这样写:
public class indexController {
@Autowired
private JdbcTemplate jdbcTemplate; //JdbcTemplate对象
@RequestMapping(value ="/article",method = RequestMethod.GET)
public String Article(ModelMap map)
{
String sql = "select articleId from articleInfo";
String articleId = jdbcTemplate.queryForObject(sql, String.class); //只能Integer或String
//接收的变量也用Integer或String,除非转类型
System.out.println(articleId);
return "article"; //返回 article.html,无关
}
当我打开网页时,就会输出了一条查询记录啦:
queryForObject
只会返回一个结果。
- 当查询结果有多条,或查询多个字段元素时可以这样:
String sql = "select articleId,createdDate,createdTime,readNm,articleName,up,comment from articleInfo";
List<Map<String, Object>> article = jdbcTemplate.queryForList(sql); //返回字符串
System.out.println(article.get(0)); //输出第一条记录的所有字段
System.out.println(article.get(0).get("articleName")); //输出第一条记录的articleNm字段
输出结果:
- 进行增删改时,可以使用
jdbcTemplate.update
:
String sql = "delete from article WHERE articleId=?;";
int i = jdbcTemplate.update(sql,1); //此处1为sql的参数,idea会在此处提示args
System.out.println("删除了"+i+"条数据");
输出结果:
7、动态网址网页:
在原本网址后面添加后缀{articleID}
,并将articleID
作为下方数据库查询的参数,查询到这篇文章的文章信息,然后通过addAttribute
将文章的信息加载到前端页面,就简单的实现了一个打开到文章的功能:
@RequestMapping(value ="/article/{articleID}",method = RequestMethod.GET)
public String Article(@PathVariable("articleID") String articleID, ModelMap map)
{
String sql = "select articleId,createdDate,articleText,readNm,articleName,up,comment " +
"from articleInfo where articleId = ?";
//article作为参数
List<Map<String, Object>> article = jdbcTemplate.queryForList(sql,articleID);
if (article.size() == 0)
{
//没有找到这个文章的ID,返回404。
map.addAttribute("errCode","404");
map.addAttribute("errMess","文章不存在");
//注意了,这个404不是数字,是自己画的 404.html 页面
return "404";
}
else { //找到该文章
//浏览量+1
Integer readNm = (Integer) article.get(0).get("readNm"); //string转integer
readNm+=1;
//更新浏览量
String updateReadNm = "update articleinfo set readNm = ? where articleId = ?";
jdbcTemplate.update(updateReadNm,readNm,articleID);
//文章信息加载到前端页面中
map.addAttribute("articleName", article.get(0).get("articleName")); //文章名
map.addAttribute("createdDate", article.get(0).get("createdDate")); //创建日期
map.addAttribute("articleText", article.get(0).get("articleText")); //文章内容
map.addAttribute("readNm", article.get(0).get("readNm")); //阅读数
map.addAttribute("comment", article.get(0).get("comment")); //评论数
map.addAttribute("up", article.get(0).get("up")); //点赞数
return "article"; //跳转到 article
}
}
数据库中有两篇文章信息,所以在浏览器输入请求192.168.1.5:8080/article/1
,即打开到第一篇文章:
到达的页面还是article.html
,只是添加了它的网址后缀和一些文章的信息,同时看到数据库,浏览量也从199
变成了200
:
不过这样刷新也会增加浏览量,由于是我个人的博客,也就无所谓啦。
8、对8080页面重定向:
8080
页面会自动定向至index.html
,同时也作为通过域名访问的页面,但是由于比我的主页的路径不同,所以8080
页面有的资源不加载,所以干脆给他重定向,当然也可以跳转到其他页面。
//对8080页面进行重定向
//8080页重定向
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView redirect(ModelMap map, ModelAndView view) {
view.setViewName("redirect:/home");
return view;
}
这样每次访问8080
页面就会自动跳转到 localhost:8080/home
页面了。