发表于: 2018-01-10 10:32:41

2 598


今天完成的事情

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项目


最后,麻烦师兄审核


返回列表 返回列表
评论

    分享到