发表于: 2018-04-07 15:51:58

1 695


今天完成的事情:可简略看,都是实验记录

一、RESTful详解

1.Rest架构的主要原则

     网络上的所有事物都被抽象为资源

    每个资源都有一个唯一的资源标识符

    同一个资源具有多种表现形式(xml,json等)

    对资源的各种操作不会改变资源标识符

    所有的操作都是无状态的

    符合REST原则的架构方式即可称为RESTful

2.为什么会出现Restful

在Restful之前的操作:

http://127.0.0.1/user/query/1 GET  根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息

RESTful用法:
http://127.0.0.1/user/1 GET  根据用户id查询用户数据
http://127.0.0.1/user  POST 新增用户
http://127.0.0.1/user  PUT 修改用户信息
http://127.0.0.1/user  DELETE 删除用户信息

之前的操作是没有问题的,大神认为是有问题的,有什么问题呢?你每次请求的接口或者地址,都在做描述,例如查询的时候用了query,新增的时候用了save,其实完全没有这个必要,我使用了get请求,就是查询.使用post请求,就是新增的请求,我的意图很明显,完全没有必要做描述,这就是为什么有了restful.

神说要有RESTful,于是就有了RESTful!

3.

安全:昨天总结说到get方法必须得保证安全性,不能在里面添加例如删除之类的操作,即get不能改变数据库。这也是为什么不用session.commit()依然可以查询数据,但是却不能增删改

幂等:因为插入数据时如果不涉及唯一索引的话,每一次重复操作都会插入新的数据,所以是幂等性的,而另外的删改查的重复操做是不会继续改变数据库的。

4.HTTP相应状态码


二、JSP

1.在webapp下创建index.jsp,在Run中添加jetty,启动页设置为index.jsp

<%--通知浏览器以utf-8解码--%>
<%@page contentType="text/html; charset=UTF-8"

       pageEncoding="UTF-8" import="java.util.*" %>
<%--如果jsp中出现了中文则以utf-8解码,引入java.util包,导入多个包可以用逗号隔开--%>
你好,欢迎登陆!
<%--显示内容--%>
<br/>

<%=new Date().toLocaleString()%>
<%--输出当前时间,相当于servlet中使用response.getWriter()进行输出--%>

启动后页面如下

2.执行流程

① 把 index.jsp转译index_jsp.java
②index_jsp.java 位于

C:\Users\thinkpad\AppData\Local\Temp\jetty-0.0.0.0-8080-MybatisTest01-1.0-SNAPSHOT-_-any-3629355434249767480.dir\jsp\org\apache\jsp

③index_jsp.java是一个servlet

这是因为打开会发现其继承了HttpJspBase,而HttpJspBase 继承了HttpServlet

④ 把index_jsp.java 编译为index_jsp.class
⑤ 执行index_jsp,生成html
⑥通过http协议把html 响应返回给浏览器

3.页面元素

jsp包含的页面元素:

①静态内容:html,css,javascript等

②指令:以<%@开始 %> 结尾,比如<%@page import="java.util.*"%>

③表达式 <%=%>,用于输出一段html

④Scriptlet:在<%%> 之间,可以写任何java 代码

⑤声明:在<%!%> 之间可以声明字段或者方法。但是不建议这么做。

⑥动作:<jsp:include page="Filename" > 在jsp页面中包含另一个页面。

⑦注释 <%-- -- %>,不同于 html的注释 <!-- --> 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了,依然可以使用ctrl+/

4.上面第三种和第四种都可以输出同样的内容

<%="Hello,welcome login"%>
<br/>
<%out.print("Helle,welcome login");%>
<br/>

其中out是jsp的隐式对象,可以直接使用

第一种不需要“;”,而第二种和java一样需要“;”

5.for循环

可以使用for循环来输出内容,要习惯组合几种jsp中的语法

<%
   List<String> words=new ArrayList<String>();
   words.add("淡然销魂泪满觞,");
   words.add("定须谨记难相忘.");
   words.add("最爱放歌倚纵酒,");
   words.add("帅哥如吾自惆怅.");
%>
<table width="150px" align="left" border="1" cellspacing="1">
<%--<table>代表表格</table>--%>
   <%for (String word:words){%>
       <%--中间需要插入html标签,所以需要使用<%%>框起来--%>
   <tr>
<%--<tr>代表表格中的一行</tr>--%>
       <td><%=word%></td>
<%--<td>代表表格中的一列</td>,'tr'与'td'交成一个单元格--%>
   </tr>
<%--<table>...</table>之间有多少个<tr>,就有多少行,<tr>...</tr>之间有多少个<td>,就有多少列--%>
       <%}%>
</table>

加载页面如下

6.include

使用include可以将另外一个页面包含到本页面中

①Include指令

<%@include file="footer.jsp" %>
<%--include指令--%>

②include动作

<jsp:include page="footer.jsp" />
<%--include动作,两种作用一样--%>

footer.jsp

<hr>
<%--hr标签代表插入一条水平线--%>
<p style="text-align:center">copyright@2016
</p>
<%--<p> 标签定义段落,p元素会自动在其前后创建一些空白,浏览器会自动添加这些空间。--%>

结果如下

可以看到指令和动作效果是一样的,都将footer.jsp页面插入到了index.jsp中

但是两者是有区别的

如果使用指令,footer.jsp的内容会被插入到 index.jsp 转译 成的index_jsp.java中,最后只会生成一个index_jsp.java文件

而使用动作,footer.jsp的内容不会被插入到index.jsp 转译 成的index_jsp.java中,还会有一个footer_jsp.java独立存在。 index_jsp.java 会在服务端访问footer_.jsp.java,然后把返回的结果,嵌入到响应中。

所以,如果两个jsp涉及参数的话,使用指令因为是将两个jsp合二为一所以不需要传参,而动作则需要独立访问footer.jsp,所以就有传参的必要了。

<jsp:include page="footer.jsp" >
<jsp:param  name="year" value="2017" />
</jsp:include>
<hr>
<%--hr标签代表插入一条水平线--%>
<p style="text-align:center">copyright@<%=request.getParameter("year")%>
   <%--将index.jsp中的参数取出来加在@后面--%>
</p>

其实还是用指令比较简单一点,起码不用传参,只需要改变footer.jsp界面就好

7.跳转

①客户端跳转,即url改变

<%
   response.sendRedirect("index.jsp");
%>
<%--客户端跳转--%>

②服务端跳转,即url不变

<jsp:forward page="index.jsp"/>
<%--服务端跳转--%>

8.Cookie

①Cookie是一种浏览器和服务器交互数据的方式。

Cookie是由服务器端创建,但是不会保存在服务器。

创建好之后,发送给浏览器。浏览器保存在用户本地。

下一次访问网站的时候,就会把该Cookie发送给服务器。

9.session

Session对应的中文翻译是会话。 
会话指的是从用户打开浏览器访问一个网站开始,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。 直到该用户关闭浏览器为止,都属于同一个会话。

10.作用域

JSP有4个作用域,分别是 
①pageContext 当前页面 :

准备setContext.jsp和getContext.jsp,分别表示向作用域设置数据,和从作用域获取数据。

pageContext表示当前页面作用域

通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面就不能访问了。如下,切换到get界面就取不到值了

②requestContext 一次请求 

requestContext 表示一次请求。随着本次请求结束,其中的数据也就被回收。


如果发生了服务端跳转,从setContext.jsp跳转到getContext.jsp,这其实,还是一次请求。 所以在getContext.jsp中,可以取到在requestContext中设置的值
这也是一种页面间传递数据的方式,如下,已经发生了客户端跳转,pageContext的值已经显示不出来了

客户端跳转,浏览器会发生一次新的访问,新的访问会产生一个新的request对象。

所以页面间客户端跳转的情况下,是无法通过request传递数据的。如下,在set界面跳转到了get界面,值就没了

③sessionContext 当前会话 

sessionContext 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。 
所以页面间传递数据,也是可以通过session传递的。
但是,不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。

④applicationContext 全局,所有用户共享

applicationContext 指的是全局,所有用户共享同一个数据
在JSP中使用application对象, application对象是ServletContext接口的实例
也可以通过 request.getServletContext()来获取。
所以 application == request.getServletContext() 会返回true
application映射的就是web应用本身。

11.隐式对象

JSP的隐式对象指的是不需要显示定义,直接就可以使用的对象

JSP一共有9个隐式对象,分别是 
request,代表请求

response,代表响应

out ,代表输出

pageContext,当前页面作用域

 session,会话作用域

application ,全局作用域
page,表示当前对象

config,可以获取一些在web.xml中初始化的参数。

exception,exception 对象只有当前页面的<%@page 指令设置为isErrorPage="true"的时候才可以使用。
同时,在其他页面也需要设置 <%@page 指令 errorPage="" 来指定一个专门处理异常的页面。

12.JSTL (JSP Standard Tag Library )标准标签库 

set、out、remove标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
<%--在页面中使用JSTL需要在jsp中 通过指令进行设置--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--prefix="c" 表示后续的标签使用都会以<c: 开头--%>
<c:set var="name" value="${'gareen'}" scope="request" />
<%--在作用域request中设置name,相当于
<%request.setAttribute("name","gareen")%>--%>

通过标签获取name: <c:out value="${name}" /> <br>
<%--相当于 <%=request.getAttribute("name")%>--%>
<c:remove var="name" scope="request" /> <br>
<%--在作用域request中删掉name,相当于
<%request.removeAttribute("name")%>--%>
通过标签获取name: <c:out value="${name}" /> <br>

JSTL通过<c:if test=""> 进行条件判断
但是JSTP没有<c:else,所以常用的办法是在<c:if的条件里取反
配合if使用的还有通过empty进行为空判断
empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="hp" value="${10}" scope="request" />
<c:if test="${hp<5}">
<p>这个英雄要挂了</p>
</c:if>
<c:if test="${!(hp<5)}">
<p>这个英雄觉得自己还可以再抢救抢救</p>
</c:if>
<%
   pageContext.setAttribute("weapon", null);
   pageContext.setAttribute("lastwords", "");
   pageContext.setAttribute("items", new ArrayList());
%>
<c:if test="${empty weapon}">
<p>没有装备武器</p>
</c:if>
<c:if test="${empty lastwords}">
<p>挂了也没有遗言</p>
</c:if>
<c:if test="${empty items}">
<p>物品栏为空</p>
</c:if>

choose标签,提供了else的功能,可以使用if来代替

<c:set var="hp" value="${3}" scope="request" />
 
<c:choose>
    <c:when test="${hp<5}">
        <p>这个英雄要挂了</p>
    </c:when>
    <c:otherwise>
        <p>这个英雄觉得自己还可以再抢救抢救</p>
    </c:otherwise>
</c:choose>


forEach标签,用来循环遍历,其与for循环遍历对比如下

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%
   List<String> heros = new ArrayList<String>();
   heros.add("塔姆");
   heros.add("艾克");
   heros.add("巴德");
   heros.add("雷克赛");
   heros.add("卡莉丝塔");
   request.setAttribute("heros",heros);
%>
<!-- 使用jsp中的for循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<%
       int i =0;
       for (String hero : heros) {
           i++;
   %>
   <tr>
<td><%=i%></td>
<td><%=hero%></td>
</tr>
<%}%>
</table>
<br>
<!-- 使用JSTL中的c:forEach 循环来遍历List -->
<table width="200px" align="center" border="1" cellspacing="0">
<tr>
<td>编号</td>
<td>英雄</td>
</tr>
<c:forEach items="${heros}" var="hero" varStatus="st"  >
<%--items="${heros}" 表示遍历的集合--%>
       <%--var="hero" 表示把每一个集合中的元素放在hero上--%>
       <%--varStatus="st" 表示遍历的状态--%>
       <tr>
<td><c:out value="${st.count}" /></td>
<td><c:out value="${hero}" /></td>
</tr>
</c:forEach>
</table>

可以看到相比for循环,其结构比较简单,而且不需要因为穿插java和html语言而加大阅读难度

forTokens

<c:forTokens专门用于字符串拆分,并且可以指定多个分隔符

<c:set var="heros" value="塔姆,艾克;巴德|雷克赛!卡莉丝塔" />
 
<c:forTokens items="${heros}" delims=":;|!" var="hero">
    <c:out value="${hero}" /> <br />
</c:forTokens>

fmt 标签常用来进行格式化,其中fmt:formatNumber用于格式化数字

其中fmt:formatDate 用于格式化日期

使用前需先添加

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix='fmt' %> 

fn标签提供各种实用功能,首先使用之前使用加入如下指令

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

13.EL表达式

为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored="false"

EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性,EL会按照从小到大的优先级顺序获取 
pageContext>request>session>application

EL可以很方便的访问JavaBean的属性,

获取JavaBean的属性,只需要通过.符号操作就可以了。
像这样 ${hero.name} ,就会自动调用getName方法了
注: 如果属性是boolean类型,那么就会自动调用isXXX方法了

EL表达式还可以做到request.getParameter("name") 这样的形式获取浏览器传递过来的参数,即获取的参数显示在url中

进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码

eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于 
lte、le 小于等于 
not非 mod求模 
is [not] div by是否能被某数整除 
is [not] even是否为偶数 
is [not] odd是否为奇

${killNumber ge 10? "超神":"还没超神" },和java中的那啥也很像


明天计划的事情:(一定要写非常细致的内容) 

学习controller的写法

遇到的问题:(遇到什么困难,怎么解决的) 

知识点太多了,要多用才能记住,还要熟悉html标签

收获:(通过今天的学习,学到了什么知识)

学习了jsp的基本知识



返回列表 返回列表
评论

    分享到