黑马程序员技术交流社区

标题: web核心技术总结二 [打印本页]

作者: fashionkillyou    时间: 2017-11-23 22:23
标题: web核心技术总结二
[Java] 纯文本查看 复制代码
30.8.3记录用户的商品浏览记录:        261
步骤分析:
【步骤一】:在登录完成后,显示商品列表页面.
【步骤二】:为商品列表页面做一些准备工作.
【步骤三】:点击某个商品,将商品ID传递一个Servlet.
【步骤四】:在Servlet中:判断是否是第一次浏览商品
【步骤五】:如果是第一次:将商品的ID存入到Cookie中即可.
【步骤六】:如果不是第一次:判断该商品是否已经浏览了.
【步骤七】:如果浏览器过.删除之前元素,将该元素添加到最前面.
【步骤八】:如果没有浏览过该商品.判断最大长度,没有超过限制,直接加到最前,如果已经超过限制,删除最后一个,将其插入到最前.
代码实现:
public class ProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* * 接收商品id.
* * 接收从客户端带过来的所有Cookie.
* * 从Cookie的数组中查找指定名称的Cookie.
* * 判断是否是第一次浏览商品:
* * 第一次浏览商品
* * 直接将商品的ID存入到Cookie.
* * 将Cookie回写到浏览器.
* * 不是第一次浏览商品 1-2
* * 判断当前的商品是否已经在浏览记录.
* * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始.
* * 没在浏览记录中:
* * 判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个 将当前元素添加到最前面.
* * 没有超过:直接将该元素添加到最前位置.
* * 将转换的id的值存入到Cookie,回写浏览器.
*/
// 接收id:
String id = request.getParameter("id");
// 获得所有的Cookie的信息:
Cookie[] cookies = request.getCookies();
// 判断是否是第一次:
Cookie cookie = CookieUtils.findCookie(cookies, "history");
if(cookie == null){
// 第一次浏览商品
Cookie c = new Cookie("history",id);
c.setPath("/day11");
c.setMaxAge(60*60*24*7);
response.addCookie(c);
}else{
// 不是第一次浏览
// 判断选择的商品是否已经在浏览记录中 2-1
String value = cookie.getValue();
String[] ids = value.split("-");
// 将数组变为集合:
LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));
if(list.contains(id)){
// 之前浏览过该商品
list.remove(id); // 1-2-3
list.addFirst(id);
}else{
// 没有浏览过该商品.
if(list.size() >=3 ){
// 超过3个
list.removeLast();
list.addFirst(id);
}else{
// 没到3个.
list.addFirst(id);
}
}
// 将list中的元素取出,使用-连接上保存到Cookie,写回浏览器.
StringBuffer sb = new StringBuffer();
for(String s:list){
sb.append(s).append("-");
}
String sValue = sb.toString().substring(0,sb.length()-1);
System.out.println(sValue);
// 存入到Cookie中
Cookie c = new Cookie("history",sValue);
c.setPath("/day11");
c.setMaxAge(60*60*24*7);
response.addCookie(c);
}
request.getRequestDispatcher("/demo2/product_info.htm").forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

}
清空浏览记录:

删除持久性的Cookie:
//首先要保证名称和路径一致,然后将setMaxAge(0)置为0
public class ClearServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("history",null);
cookie.setPath("/day11");
cookie.setMaxAge(0);
response.addCookie(cookie);
response.sendRedirect("/day11/demo2/product_list.jsp");
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}
30.9.1【Session的概述】        264
session和cookie的区别: cookie本身是有大小和个数限制的,session没有限制.cookie的数据保存在客户端,session数据保存在服务器端.
* 获得Session:
* request.getSession();
session是域对象:
session何时创建和销毁?作用范围:
*创建:服务器端第一次调用getSession()创建session.
*销毁:三种情况销毁session:
1session过期.默认过期时间是30分钟.tomcat的conf里面的web.xml里面有一个session的settimeout可以修改
非正常关闭服务器(服务器断电),如果正常关闭服务器session就会序列化到硬盘,下次启动的时候再反序列化到服务器.
手动调用session.invalidate();
*作用范围:多次请求(一次会话,结束一次会话是关闭浏览器)

30.10 JSP&EL&JSTL        267
30.10.1 JSP        268
jsp:Java Server Page(Java服务器端的页面)
Ø 执行JSP的过程:
* JSP翻译成Servlet,编译这个Servlet的类,生成class文件.得到执行.
jsp的脚本
<%! %>
<% %>
<%= %>
jsp的注释
HTML的注释        :<!-- 注释 -->
Java代码的注释        :// 单行注释 /*多行注释*/ /** 文档注释 */
JSP的注释        :<%-- JSP的注释 --%>
jsp的指令
指令的语法:
<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%>
三大指令:
page指令:<%@ page %> -- 设置JSP的.
include指令:指示JSP静态包含其他的页面. 被包含的页面是不需要写HTML的结构体的,可以直接写上jsp的头和页面的内容
taglib指令:指示JSP引入标签库.
jsp的内置对象
request
response
session
application
page
pagecontext
config
out
exception

out内置对象:out和response.getWriter是不是同一个对象?区别是什么?
* 不是out真实对象JspWriter ,response获得Writer是PrintWriter.
* out输出会把内容放到out缓冲区(JspWriter缓冲区),response输出会把内容放到response缓冲区(PrintWriter缓冲区).
* out缓冲区不能直接向页面输出,把内容先放到response缓冲区里面,通过response缓冲区才能向页面输出

jsp的四个域
PageScope 当前页面中有效
RequestScope 一次请求范围
SessionScope 一次会话范围
ApplicationScope 在此项目范围内有效

jsp的动作标签
<jsp:forward /> 用于页面转发
* <jsp:forward page="/demo1-jsp/demo3-object/demo3.jsp"></jsp:forward>
<jsp:include /> 用于页面的包含(动态包含)

静态包含和动态包含的区别?
静态包含相当于代码的copy,然后整合到一个java文件中一起编译
动态包含相当于结果的copy,各自编译完之后,将显示结果整合到一起显示
30.10.2 EL表达式:
expression language
使用EL表达式:
* 语法:${ EL表达式 }

获取域中的值:
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}

获取数组的值
${array[0]}
${array[1]}

获取集合的值
${list[0]}
${list[1]}

获取map集合的值
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa","李旭华");
map.put("bbb","杨久君");
map.put("ccc","李芮");
map.put("ddd","李凤");
pageContext.setAttribute("map", map);
%>
${ map.aaa }
${ map.bbb }
${ map.ccc }
${ map.ddd }

获取对象的数据
<%
User user = new User(1,"aaa","123");
pageContext.setAttribute("user", user);
%>
${ user.id }
${ user.username }
${ user.password }

获取对象集合
<%
User user1 = new User(1,"aaa","123");
User user2 = new User(2,"bbb","123");
User user3 = new User(3,"ccc","123");

List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
userList.add(user3);

pageContext.setAttribute("userList", userList);
%>
${userList[0].id} - ${userList[0].username} - ${ userList[0].password }
${ userList[1].id } - ${ userList[1].username } - ${ userList[1].password }
${ userList[2].id } - ${ userList[2].username } - ${ userList[2].password }

***** .和[]的区别.
* []用于有下标的数据(数组,list集合) .用于有属性的数据(map,对象)
* 如果属性名中包含有特殊的字符.必须使用[]

EL执行运算
<%
pageContext.setAttribute("n1", "10");
pageContext.setAttribute("n2", "20");
pageContext.setAttribute("n3", "30");
pageContext.setAttribute("n4", "40");
%>

${n1+n2+n3}

逻辑运算
${n1 < n2} - ${n1 lt n2} less than
${n1 > n2} - ${n1 gt n2} great than
${n1 >= n2} - ${n1 ge n2} great equal
${n1 <= n2} - ${n1 le n2} less equal
${n1 == n2} - ${n1 eq n2} equal
关系运算
${ n1<n2 && n3 < n4 } - ${ n1<n2 and n3 < n4 }<br/>
${ n1<n2 || n3 < n4 } - ${ n1<n2 or n3 < n4 }<br/>
${ !(n1 < n2) } - ${ not(n1<n2) }
三元运算
${n1 < n2 ? "正确":"错误"}
empty运算(经常用到)
${user == null} - ${empty user}
${user != null} - ${not empty user}

操作常用对象(11个)
pageScope,requestScope,sessionScope,applicationScope-获取jsp中域中的数据
param,paramValues -接收参数
header,headervalues -获取请求头信息
initParam -获取全局初始化参数
cookie -web开发中的cookie
pageContext -web开发中的pageContext

<h3>接收请求的参数</h3>
<%= request.getParameter("id") %>
<%= request.getParameter("name") %>
<%= Arrays.toString(request.getParameterValues("hobby")) %>
<hr/>
${ param.id }
${ param.name }
${ paramValues.hobby[0] }
${ paramValues.hobby[1] }
<h3>获取请求头</h3>
<%= request.getHeader("User-Agent") %>
<hr/>
${ header["User-Agent"] }
<h3>获取全局初始化参数</h3>
${ initParam.username }
<h3>获取Cookie中的值</h3>
${ cookie.history.value }
<h3>获取PageContext中的对象</h3>
IP地址:${ pageContext.request.remoteAddr }
工程路径:${ pageContext.request.contextPath }

30.10.3 JSTL
JSP Standard Tag Library JSP标准标签库
注意jstl的1.0版本是不支持el表达式的,所以在引入jstl时要引用1.0以上的版本的
JSTL的标签库:包含了五类标签
core(核心标签),fmt(国际化标签),xml(xml标签),SQL(SQL标签),fn(JSTL提供el函数库使用JSTL:

使用JSTL:
* 引入JSTL的相关的jar包.两个jar包 jstl.jar 和 standard.jar
* 在页面中引入标签库.<%@ taglib uri=”” prefix=””%>)

核心标签的用法

if
<c:set var="n1" value="30" scope="page"></c:set>
<c:set var="n2" value="20" scope="page"></c:set>

<c:if test="${n1 < n2}">
n1小于n2
</c:if>

forEach
<遍历数组>
<%
String[] arrs = {"李旭华","李冠希","董阳阳"};
pageContext.setAttribute("arrs", arrs);

%>
<c:forEach var="i" items="${arrs}">
${i}
</c:forEach>

<遍历list集合>
<%
List list = new ArrayList();
list.add("李旭华");
list.add("李冠希");
list.add("董阳阳");
pageContext.setAttribute("list",list);
%>

<C:forEach var="i" items="${list}">
${i}
</c:forEach>

<遍历map>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa","李旭华");
map.put("bbb","李冠希");
map.put("ccc","董阳阳");
pageContext.setAttribute("map",map);
%>
<C:forEach var="entry" items="${map}">
${entry.key} - ${entry.value}
</c:forEach>

<遍历从1到100>
<c:forEach var="i" begin="1" end="100" step="2">
${i}
</c:forEach>

<遍历从100到300> 隔两个变一次色
<c:forEach var="i" begin="100" end="300" step="5" varStatus="status">
<c:if test="${status.count % 3 == 0}">
<font color="red">${i}</font>
</c:if>
<c:if test="${status.count % 3 != 0}">
${i}
</c:if>
</c:forEach>
30.10.3.3【JSTL的提供EL的函数库】
<h1>JSTL提供的EL的函数库</h1>
${ fn:contains("Hello World","Hello") }
${ fn:length("HelloWorld") }
${ fn:toLowerCase("ABCDE") }
<c:forEach var="i" items='${ fn:split("a-b-c-d","-") }'>
${ i }
</c:forEach>


作者: wheat    时间: 2017-11-23 23:10
总结的到位,赞一个

作者: 枫林醉wisdom    时间: 2017-11-24 01:30
根本6666666666666666不错

作者: 丶唯萌Pro    时间: 2017-11-29 23:26
可以的哦!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2