发表于: 2018-01-10 10:32:41
2 601
今天完成的事情
1.学习如何使用svn
(1)svn是啥?
它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历史,Subversion可以通过网络访问它的版本库,从而使用户在不同的电脑上进行操作。
按照教程开始搭建svn,这个过程比较简单,这里不再赘述。
然后将自己的任务一代码传进了svn下自己的文件夹
2.继续学习springmvc
看了看之前的师兄的日报,有一些收获:
总结下来,构成基于SpringMVC应用程序的最基本要素。它们分别是:
入口程序 —— DispatcherServlet
核心配置 —— [servlet-name]-servlet.xml
控制逻辑 —— UserController
还有昨天遇到的两种方法
Servlet中的两大核心方法init方法和service方法,它们的运行时间和触发条件都截然不同: (这部分没有能够完全理解)
(1). init方法
在整个系统启动时运行,且只运行一次。因此,在init方法中我们往往会对整个应用程序进行初始化操作。这些初始化操作可能包括对容器(WebApplicationContext)的初始化、组件和外部资源的初始化等等。
(2). service方法
在整个系统运行的过程中处于侦听模式,侦听并处理所有的Web请求。因此,在service及其相关方法中,我们看到的则是对Http请求的处理流程。
常用的注解:
@Controller 声明Action组件
@Service 声明Service组件 @Service("myMovieLister")
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时.
@RequestMapping("/menu") 请求映射
@Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@Scope("prototype") 设定bean的作用域
springmvc处理流程:
步骤1 —— 对Http请求进行初步处理,查找与之对应的Controller处理类(方法)
步骤2 —— 调用相应的Controller处理类(方法)完成业务逻辑
步骤3 —— 对Controller处理类(方法)调用时可能发生的异常进行处理
步骤4 —— 根据Controller处理类(方法)的调用结果,进行Http响应处理
述的四个流程也就被定义为了四个不同接口,它们分别是:
步骤1 —— HandlerMapping
步骤2 —— HandlerAdapter
步骤3 —— HandlerExceptionResolver
步骤4 —— ViewResolver
3.REST接口知识点学习
REST对请求的约定,可以简单粗暴的抽象为一下两个规则
(1)请求API的URL表示用来定位资源
(2)请求的METHOD表示对这个资源进行的操作
API的URL
URL用来定位资源,跟要进行的操作区分开,这意味着URL中不应该出现动词
例如:
/api/getUser
/api/updateUser
/api/deleteUser
/api/resetUser
在更新的时候:会加上额外的接口
/api/updateUserName
/api/updateUserEmail
/api/updateUser
这样的坏处就是加入了动词,使URL更长了,而且更新不同的信息成为了一个新的URL,导致过多难以管理。
在 REST 架构的链接应该是这个样子:
1. URL 中不应该出现任何表示操作的动词,链接只用于对应资源;
2. URL 中应该单复数区分,推荐的实践是永远只用复数;比如 GET /api/users 表示获取用户的列表;如果获取单个资源,传入 ID,比如 /api/users/123 表示获取单个用户的信息;
3. 按照资源的逻辑层级,对 URL 进行嵌套。
例如
/api/teams (对应团队列表)
/api/teams/123 (对应 ID 为 123 的团队)
/api/teams/123/members (对应 ID 为 123 的团队下的成员列表)
/api/teams/123/members/456 (对应 ID 为 123 的团队下 ID 为 456 的成员)
这个就很清楚,而且URL数量比较少,便于管理
API的请求方法
也就是Udine数据的CRUD的方法。
资源的读取用GET方法
GET /api/users ( 表示读取用户列表)
资源的创建用POST
POST /api/users { "name": "John Snow"}
这个请求会在服务器上创建一个name属性值为John Snow的用户,多次请求会创建多个用户,所以这个操作不是幂等的。
资源的更新用PUT和PATCH
PUT 用于更新资源的全部信息,在请求的 body 中需要传入修改后的全部资源主体;
而 PATCH 用于局部更新,在 body 中只需要传入需要改动的资源字段。
举个例子就是:假设服务器上有这样一个资源 /api/users/123:
{ "id": 123, "name": "Original", "age": 20}
PUT /api/users/123{ "name": "PUT Update"} 我们发送这样一个请求至服务器,那么修改结果如下:
{ "id": 123, "name": "PUT Update"} 可以发现原来资源的age字段被清除了。
接下来是使用PATCH
PATCH /api/users/123{ "name": "PATCH Update"} 发送一个请求修改资源的name,结果如下:
{ "id": 123, "name": "PATCH Update", "age": 20} 只有指定的地方被修改了。
其实简单说就是全部更新与局部更新,有了上面的例子就可以更直观的理解了。
删除资源用DELET,这个就很直观了
DELETE /api/users/123
4.学习jsp一些知识,我在昨天的项目里面想要在页面显示中文的时候遭遇了乱码,今天倒是知道了是因为啥:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
昨天的项目里面没有设置网页的编码字符,少了后面的第二句,在今天学习了之后明白了,是通知浏览器以UTF-8进行中文解码,
<%=new Date().toLocaleString()%>在jsp中添加这行代码会输出当前时间。
jsp制表:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%
List<
String
> words = new ArrayList<
String
>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
//下面是制表,第一个参数是表的长度,第二个是表的水平对齐方式,第三个是表的边框厚度,第四个是规定单元格与单元格之间的空白
//
<
table
width
=
"200px"
align
=
"center"
border
=
"1"
cellspacing
=
"0"
>
<%for (String word : words) {%>
<
tr
> //定义表格中的行,这里只有一组,所以一行
<
td
><%=word%></
td
> // td定义单元格
</
tr
>
<%}%>
</
table
>
至此就有了一个表:
至于下面的2016是加的一个脚本
5.开始正式搞REST风格接口
一开始没有任何头绪,观察了一下师兄的项目,突然灵光一现,再结合REST URL的定义,好像突然明白应该怎么做了,于是开始写了一个脚本,让其显示一个copyright:
footer.jsp
<hr>
<p style="text-align:center">copyright@2016
</p>
然后在controller类下面加上这样的:直接上传成品:
package example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/test")
public class IndexController {
@RequestMapping("/index")
public String index() {
return "index";
}
@RequestMapping("/footer")
public String footer(){return "footer";}
}
加的是最后两行,我的理解是 @RequestMapping指定的就是URL的一部分,就是嵌套URL后面的东西,我加上footer之后,预计打开网页的时候在项目名后面加上/test/footer 会显示我这copyright@2016:然后运行一下试试:
可以看到和预期效果一样,通过这样,了解了REST风格,我认为后面加的footer就是REST风格的接口
6.受到上面的启发
开始结合自己的任务一的代码写web项目,这里参考了别人的教程:先上传项目结构:
上面就是完整的项目结构
下面是依赖文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringMVCREST</groupId>
<artifactId>task2</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>task2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>springMVC+REST</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
<configuration>
<stopPort>9966</stopPort>
<stopKey>foo</stopKey>
<stopWait>10</stopWait>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后是controller类
package com.jnshu.controller;
import com.jnshu.pojo.Student;
import com.jnshu.service.StudentService;
import org.omg.CORBA.INTERNAL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
@Controller
public class RestController {
@Autowired
private StudentService studentService;
@RequestMapping(value = "/stus",method = RequestMethod.GET)
public String getAll(Model model){
List<Student> students = studentService.getAll();
model.addAttribute("students",students);
return "list";
}
@RequestMapping(value = "/addStu",method = RequestMethod.GET)
public String input(Map<String,Object> map){
map.put("student",new Student());
return "input";
}
@RequestMapping(value = "/addStu",method = RequestMethod.POST)
public String create(Integer id,String name, Integer qq, String school, String type, String say, Integer create_at, Integer update_at, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
studentService.create(id,name,qq,school,type,say,create_at,update_at);
return "redirect:/stus";
}
@RequestMapping(value = "/delStu/{id}",method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Integer id) {
studentService.delete(id);
return "redirect:/stus";
}
@RequestMapping(value = "/seeStu/{id}",method = RequestMethod.GET)
public String getOne(@PathVariable("id") Integer id, Model model){
Student student = studentService.getOne(id);
model.addAttribute("student",student);
return "detail";
}
@RequestMapping(value = "/updStu/{id}",method = RequestMethod.GET)
public String in(@PathVariable("id") Integer id,Model model){
Student student = studentService.getOne(id);
model.addAttribute("student",student);
return "in";
}
@RequestMapping(value = "/updStu/{id}",method = RequestMethod.PUT,produces = "text/html;charset=UTF-8")
public String update(Integer qq, @PathVariable("id") Integer id) throws IOException {
studentService.update(id,qq);
return "redirect:/stus";
}
}
还有几个是任务一jdbcTemplate的代码,就不传了。
然后是jsp文件
detail.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>List</title>
</head>
<body>
<h2>学生信息</h2>
<hr>
<c:if test="${student == null}">
没有学生信息
</c:if>
<c:if test="${student != null}">
ID:${student.id}<br/>
qq:${student.qq}<br/>
name:${student.name}<br/>
school:${student.school}<br/>
类型:${student.type}<br/>
宣言:${student.say}<br/>
创建时间:${student.create_at}<br/>
更新时间:${student.update_at}<br/>
</c:if>
<hr>
</body>
</html>
in.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>List</title>
</head>
<body>
<h2>学生信息</h2>
<hr>
<%--action对应的内容是所操作的方法的url,如果URL不一致,则操作不成功--%>
<form:form action="${pageContext.request.contextPath}/updStu/${student.id}" method="put" modelAttribute="student">
<%--<input hidden name="_method" value="PUT">--%>
ID:${student.id}<br/>
<br/>
QQ:${student.qq}<br/>
QQ:<form:input path="qq"/><br/>
姓名:${student.name}<br/>
姓名:<form:input path="name"/><br/>
学校:${student.school}<br/>
学校:<form:input path="school"/><br/>
类型:${student.type}<br/>
类型:<form:input path="type"/><br/>
宣言:${student.say}<br/>
宣言:<form:input path="say"/><br/>
创建时间:${student.create_at}<br/>
更新时间:${student.update_at}<br/>
更新时间:<form:input path="update_at"/><br/>
<input type="submit" value="提交">
</form:form>
<hr>
</body>
</html>
input.jsp
<%@page import="java.util.Map"%>
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert Student</title>
</head>
<body>
<h2>新增学生信息</h2>
<hr>
<form:form action="${pageContext.request.contextPath}/addStu" method="post" modelAttribute="student">
姓名:<form:input path="name"/><br/>
QQ:<form:input path="qq"/><br/>
类型:<form:input path="type"/><br/>
学校:<form:input path="school"/><br/>
宣言:<form:input path="say"/><br/>
创建时间:<form:input path="create_at"/><br/>
<input type="submit" value="提交">
</form:form>
<hr>
</body>
</html>
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page isELIgnored="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>All Student</title>
<script type="text/javascript" language="JavaScript" src="/js/jquery-1.8.3.min.js">
function del(id) {
$.ajax({
type: 'post',
async: false,
url: '/delStu/'+id,
data: {id:id},
success:function (data) {
console.log("成功");
},error:function () {
console.log("失败");
return "error";
}
})
}
</script>
</head>
<body>
<h2>学生信息表</h2>
<c:if test="${students == null}">
<h3> 没有信息</h3>
</c:if>
<c:if test="${students != null}">
<table id="table" border="1">
<tr>
<td>ID</td>
<td>qq</td>
<td>name</td>
<td>school</td>
<td>type</td>
<td>宣言</td>
<td>创建时间</td>
<td>更新时间</td>
<td>编辑</td>
<%--<td>删除</td>--%>
</tr>
<c:forEach items="${students}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.qq}</td>
<td>${stu.name}</td>
<td>${stu.school}</td>
<td>${stu.type}</td>
<td>${stu.say}</td>
<td>${stu.create_at}</td>
<td>${stu.update_at}</td>
<td><a href="${pageContext.request.contextPath}/updStu/${stu.id}">编辑</a> </td>
<td><a onclick="del(${stu.id})" href="${pageContext.request.contextPath}/updStu/${stu.id}">删除</a></td>
</tr>
</c:forEach>
</table>
</table>
<br/>
<br/>
<br/>
<hr>
<a href="${pageContext.request.contextPath}/addStu">添加学生</a>
<hr>
</c:if>
</body>
</html>
然后传一下运行结果:
点击学生信息:
正是我本地数据库的数据。目前实现的功能有添加学生,演示如下,点击添加学生:
如图,我已经添加了信息,点击提交
添加成功。
接下来his编辑页面:
因为我的更新方法写的是根据id修改qq,下面是修改之前的:
接下来把11,12的qq都改成250:
成功。
目前的问题是删除页面提交之后没有修改,正在找解决方法。
7.安装了postman,还在调试怎么使用
目前只会输入url,来得到页面。。
今天的收货
今天算是写出来了REST接口,并且实现了几个,删除没实现,对REST风格有了一个大概的了解
今天遇到的问题
除了上面说到的删除的方法没实现意外,还有一个我认为很重要的问题,就是我不会用idea进行单步调试web项目,虽然后来下载了postman,但是还是不会使用它来调试
明天计划的事情
明天努力事项删除的方法,并且学习用idea调试web项目
最后,麻烦师兄审核
评论