发表于: 2018-04-07 15:51:58
1 696
今天完成的事情:可简略看,都是实验记录
一、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.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专门用于字符串拆分,并且可以指定多个分隔符
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的基本知识
评论