A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fashionkillyou 中级黑马   /  2017-11-23 22:23  /  1298 人查看  /  3 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

[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>

3 个回复

倒序浏览
回复 使用道具 举报
根本6666666666666666不错
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
可以的哦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马