码迷,mamicode.com
首页 > Web开发 > 详细

web基础攻略之jsp开发(综述四)

时间:2016-03-30 13:11:39      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:


1 简述:            

jsp是sun公司提供的用于开发动态网站的一门技术,jsp的全称是 java server pages , 通俗点说jsp就是 servlet,因为jsp被访问的时候 ,最终会编译成servlet。


2. jsp的使用方式

2-1 jsp的组成 html+java代码+jsp自身的东西

2-2 jsp与java代码的结合方式
    
    第一种方式 <%!    %> :定义的变量是成员的变量

    第二种方式 <%= %> : 向页面输出内容(可以写固定值,可以写变量)
    <%="hello jsp" %>,生成到servlet里面的service方法里面,生成代码 out.print("hello jsp" );

    第三种方式 <%  %>,生成到servlet的service里面
    
    例如:结合jsp生成一个五行五列的表格

效果图: 2-1 建立相关web工程 ,然后在默认目录下建立一个用于编写生成表格的jsp文件

技术分享


编写生成表格的jsp文件的内容


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'MyJsp.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

</head>

<body>
	这里是使用jsp生成的一个表格
	<br />
	<table border="1" cellpadding="10">
		<%
			for (int i = 0; i < 6; i++) {
		%>
		<tr>
			<%
				for (int j = 0; j < 6; j++) {
			%>
			<!-- java与html结合  向页面输入java中的变量值 -->
			<td>第 <%=i%>行第<%=j%> 个小表格</td>
			<%
				}
			%>
		</tr>
		<%
			}
		%>
	</table>
</body>
</html>



效果图:2-2 jsp编写生成的表格

技术分享


3  使用jsp操作域对象中的存值与取值以及使用el表达式来进行取值

3-1 基本使用逻辑


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'MyJsp2.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>

<body>
	这里是向域对象中设置值并将设置的值取出来显示到页面上
	<br>
	<%
		//向ServletContext中设置值
		getServletContext().setAttribute("contextMsg","This is Context of values");
		//向request中设置值
		request.setAttribute("requestMsg", "This is Request of Values ");
	%>
	<!--使用传统的方法取出域对象中的值-->
	ServletContext :
	<%=getServletContext().getAttribute("contextMsg")%>

	<br> request :
	<%=request.getAttribute("requestMsg")%>
	<br>
	<hr />
	使用el表达式来获取相关的值:
	<!-- 当多个域对象里面的值的名称是相同的时候 ,使用el表达式获取的是域对象中范围小的里面的值 -->
	<br /> ${contextMsg }
	<br /> ${requestMsg }
</body>
</html>



图 3-1  传统方式取值

技术分享

图 3 -2  传统方式与el表达式

技术分享

3-2 域对象存值同名问题

当多个域对象存值名称相同时,使用传统的方式直接getAtrribute的方式是可以取出相关的值的,但是使用el表达式就得使用特定的方式了


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'MyJsp2.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

</head>

<body>
	这里是向域对象中设置值并将设置的值取出来显示到页面上
	<br>
	<%
		//向ServletContext中设置值
		getServletContext().setAttribute("msg","This is Context of values");

		request.setAttribute("msg", "This is Request of Values ");
	%>
	ServletContext :
	<%=getServletContext().getAttribute("msg")%>

	<br> request :
	<%=request.getAttribute("msg")%>
	<br>
	<hr />
	使用el表达式来获取相关的值:
	<!-- 当多个域对象里面的值的名称是相同的时候 ,使用el表达式获取的是域对象中范围小的里面的值 -->
	<!-- 分别获取多个域对象里面相同名称的值  -->
	<br /> ${requestScope.msg }
	<br /> ${applicationScope.msg }
</body>
</html>

图 3-3

技术分享

注:当多个域对象里面的值的名称是相同的时候 ,使用el表达式获取的是域对象中范围小的里面的值,也就是说 如图图3-3 中的内容编写方式变为 ${msg }  ${msg } 那么我们只能取到request设置的值,因为request设置的值范围小,只可以在对应的servlet中使用,而context的范围大,设置的值可以在任何一个servlet中使用


4 cookie技术综述

4-1cookie是客户端的技术

4-2 使用cookie记录用户上次访问页面的时间

效果图: 4 -1  第一次访问的时候,页面显示 hollew world ,当点击刷新再次进行访问的时候,页面则会显示 上次访问页面的时间

技术分享

servlet中编写内容



public class CookieDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 得到所有的cookie
		Cookie[] cookies = request.getCookies();
		// visit对应用的Cookie,咱们这里是使用 "visit这个字段来记录访问次数的cookie标识"
		Cookie cookie = null;
		if (cookies != null) {
			//遍历查看是否已存在这个标识的cooike,如果存在则表示以前访问过,可以获取它对应的值,也就是访问次数
			for (int i = 0; i < cookies.length; i++) {
				// 获取对应的cookie
				Cookie cookieChile = cookies[i];
				// 获取cookie的name
				String name = cookieChile.getName();
				// 判断其中是否保存有第一次进行访问页面时存下的cookie
				if ("visit".equals(name)) {
					cookie = cookieChile;
				}
			}
		}

		// 判断cllkies中是否已有名称为visit的cookie
		if (cookie==null) {
			// 说明cokie中没有信息,则是第一次进行访问
			// 向页面输出一个信息
			response.getWriter().write("hollew world ");
			// 得到访问的时间 ,把当前的时间 存到cookie里面
			Date date = new Date();
			// 获取 当前格式 的时间
			String localeString = date.toLocaleString();
			// 把时间 放到cookies里面去
			Cookie newCookie = new Cookie("visit", localeString);
			// 把cookie写进行浏览器中去
			response.addCookie(newCookie);
		} else {
			// 如果不是第一次进行访问,那得保存的访问时间 并显示 到页面上
			String timeValue = cookie.getValue();
			response.getWriter().write(timeValue);

			// 得到本次访问的时间 ,把当前的时间 存到cookie里面
			Date date = new Date();
			// 获取 当前格式 的时间
			String localeString = date.toLocaleString();
			// 把时间 放到cookies里面去
			Cookie newCookie = new Cookie("visit", localeString);
			// 设置cookie的有效时间 ,如果不设置,那么就是会话级别的cookie,关闭浏览器,cookie就会被销毁
			newCookie.setMaxAge(3600);
			// 设置cookie有效路径
			newCookie.setPath("/");
			// 把cookie写进浏览器中去
			response.addCookie(newCookie);

		}

		/**
		 * 销毁持久性的cookie 创建一个与要销毁的cookie的相同名称的Cookie 设置这个cookie的有效时长为 0;
		 * 将这个cookie写进去浏览器中
		 */

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);

	}
}

对应的servlet文件的配制

	
	<servlet>
		<description>This is the description of my J2EE component</description>
		<display-name>This is the display name of my J2EE component</display-name>
		<servlet-name>CookieDemo1</servlet-name>
		<servlet-class>CookieDemo1</servlet-class>
	</servlet>
	<servlet-mapping>
		 <servlet-name>CookieDemo1</servlet-name>
		<url-pattern>/servlet/CookieDemo1</url-pattern>
	</servlet-mapping>
	
	




注: 当我们新创建了一个cookie的时候,一般默认是会话级别的cookie,也就是说当浏览器关闭后,cookie就会被销毁,

4-3 设置持久性cookie的方法 :

// 设置cookie的有效时间 ,如果不设置,那么就是会话级别的cookie,关闭浏览器,cookie就会被销毁
			newCookie.setMaxAge(3600);
			// 设置cookie有效路径
			newCookie.setPath("/");
			

4-4 销毁持久性的cookie的方法

* 销毁持久性的cookie 创建一个与要销毁的cookie的相同名称的Cookie

*设置这个cookie的有效时长为 0;
* 将这个cookie写进去浏览器中


4-5 使用cookie技术来保存购物浏览信息历史

效果图 4-2  当我们打开页面的时候,还没有点击浏览对应商品,那么页面显示没有浏览记录,当我们点击其中的某一商品时,代表已经浏览过该商品,然后将这个浏览记录保存到cookie中,然后再从cookie中取出来对应的浏览记录信息

技术分享


技术逻辑分析:
    首先第一次购物手电,浏览器发送请求到服务端,在服务器端得到手电,把手电存到cookie里面,再把cookie写到浏览器的内存中
    第二次购物手表,浏览器发送请求时候携带第一次存到浏览器内存中的手电购物信息进行发送,在服务器端分别得到购物的手表,携带过来的上次购物手电信息,把这两个商品的相关信息存到cookie里面,再把cookie写到浏览器的内存中...
    最终结算,携带着浏览器里面存的两个商品的信息,在服务器端可以得到商品,最终完成结算


对应的servlet

public class CookieProjetDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 得到点击商品的ID
		String projectId = request.getParameter("id");
		
		// 判断cookie中是否已经包含 project字段的cookie,当然,这里我们是使用project这个名称来记录商品的浏览的
		// 获取所有的cookie信息
		Cookie[] cookies = request.getCookies();
		// 判断储存商品浏览信息的cookie
		Cookie cookie = isHaveCurrentCookie(cookies, "project");

		if (cookie == null) {
			// 新建储存商品浏览信息的cookie
			Cookie cookie2 = new Cookie("project", projectId);
			// 设置cookie2的持久性
			cookie2.setMaxAge(3600);
			cookie2.setPath("/");
			// 将cookie2添加到浏览器的缓存中
			response.addCookie(cookie2);
		} else {
			// 获取cookie中的保存商品浏览信息
			String value = cookie.getValue();
			// 拿到之前保存的信息后,再将新的信息保存进去
			value = value + "," + projectId;
			// 将新的信息保存
			Cookie cookie2 = new Cookie("project", value);
			// 设置cookie2的持久性
			cookie2.setMaxAge(3600);
			cookie2.setPath("/");
			// 将cookie2添加到浏览器的缓存中
			response.addCookie(cookie2);
		}

		// 重定向回到商品页面
		response.sendRedirect("/JspDemo/Goodslist.jsp");

	}

	private Cookie isHaveCurrentCookie(Cookie[] cookies, String projectId) {
		if (cookies == null) {
			return null;
		}
		for (int i = 0; i < cookies.length; i++) {
			// 获取对应的cookie
			Cookie cookie = cookies[i];
			// 获取相应的cookie名称
			String name = cookie.getName();
			if (projectId.equals(name)) {
				return cookie;
			}

		}
		return null;
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);

	}

}



对应的配制


	<servlet>
		<description>This is the description of my J2EE component</description>
		<display-name>This is the display name of my J2EE component</display-name>
		<servlet-name>CookieProjetDemo</servlet-name>
		<servlet-class>CookieProjetDemo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>CookieProjetDemo</servlet-name>
		<url-pattern>/servlet/CookieProjetDemo</url-pattern>
	</servlet-mapping>
	
	
	
	

访问页面的jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'Goodslist.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

</head>

<body>
	This is my JSP page.
	<br>
	<!-- 代码块 一-->
	<img src="/JspDemo/img/1.jpg"><a href="/JspDemo/servlet/CookieProjetDemo?id=1">手电</a>
	<img src="/JspDemo/img/2.jpg"><a href="/JspDemo/servlet/CookieProjetDemo?id=2">手机</a>
	<img src="/JspDemo/img/3.jpg"><a href="/JspDemo/servlet/CookieProjetDemo?id=3">电视</a>
	<img src="/JspDemo/img/4.jpg"><a href="/JspDemo/servlet/CookieProjetDemo?id=4">冰箱</a>

	<h1>浏览记录</h1>
	<!-- 代码块二-->
	<%
	/* 获取到所有的cookie信息  */
		Cookie[] cookies = request.getCookies();
		/* 判断保存商品浏览的信息是否存在 */
		Cookie cookie = null;
		if (cookies != null) {
			for (int i = 0; i < cookies.length; i++) {
				Cookie cookie2 = cookies[i];
				if (cookie2 != null) {
					String name = cookie2.getName();
					if (name.equals("project")) {
						cookie = cookie2;
						break;
					}
				}
			}
		}
		//如果当前的cookies是null,那说明还没有保存浏览商品的信息
		//如果商品浏览信息的cookie标签,那么就是还没有 访问商品的浏览记录的相关信息
		if (cookie == null) {
	%>
	没有浏览记录
	<%
		} else {
	%>
	<%
		//获取cookie中保存的商品浏览信息
			String value = cookie.getValue();
			//获取保存的浏览商品的ID
			String[] Ids = value.split(",");
			//ID对应的商品的名称 
			String[] names = { "手电", "手机", "电视", "冰箱" };
			for (int i = 0; i < Ids.length; i++) {
				//获取浏览商品对应的ID
				String id = Ids[i];
				//根据商品id获取商品对应的名称
				int idIndex = 0;
				if (id != null && !id.equals("null")) {
					idIndex = Integer.valueOf(id);
				}
				//获取相应的商品名称 
				String name = null;
				if (idIndex != 0) {
					name = names[idIndex-1];
				}
				/* 将浏览记录显示到页面上 */
	%>
	<!--代码三   -->
	<img src="/JspDemo/img/<%=idIndex%>.jpg" /><%=name%>
	<%
		}
		}
	%>
</body>
</html>




注:

代码块一: 加载的是我们web项目下的img文件夹下的图片信息,后面绑定的超链接点击标签,对应的通过get方式将 id 参数传递


代码块二 : 是jsp中实现获取cookie的java代码块,与servlet中的一致

代码块三: 是jsp中将 java代码 中获取的cookie中的相关信息输出显示到页面上



5 session综述 

5-1 简述 

是服务器端技术

创建session

执行 request.getSession() , 返回HttpSession  

一个浏览器独占一个session对象

session对象也是一个域对象

* 范围:一次会话

* 存值 setAttribute

* 取值 getAttribute

5-2 使用session实现简单购物车

效果图 5-1  r打开页面后,加载的是商品信息页面,当我们点击相对应的标签后,我跳转到一个新的选择页面,我们可以点继续购物(跳转到商品列表页面),或者 点击结算(跳转到结算信息页面),结算信息页面是统计的购物信息

技术分享


对应的servlet

public class SeesionCookieDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 得到商品的id
		String ID = request.getParameter("id");
		// 商品对应的名称
		String[] names = { "手电", "手机", "电视", "冰箱" };
		// 获取ID对应的name
		String name = names[Integer.valueOf(ID) - 1];
		// 判断是否是第一次加入购物 车 ,这里我们使用的是cart这个字段作为标识信息
		Map<String, Integer> cartMap = (Map<String, Integer>) request
				.getSession().getAttribute("cart");
		if (cartMap == null) {
			// 创建 购物车
			cartMap = new HashMap<String, Integer>();
			// 把商品名称和数量 1存放
			cartMap.put(name, 1);
		} else {
			// 不是第一次
			// 首先判断 map中有没有相同名称的商品
			if (cartMap.containsKey(name)) {
				// 如果有,那么将其value取出来加1,再放回去
				int unmber = cartMap.get(name);
				cartMap.put(name, unmber + 1);
			} else {
				cartMap.put(name, 1);
			}
		}
		// 把map放到seesion中
		request.getSession().setAttribute("cart", cartMap);
		// 向页面输出两个超链接
		response.setContentType("text/html;charset=utf-8");
		//Goodslist2.jsp 是我们要显示购物信息的商品列表 
		//cart.jsp 是我们要显示结算购物信息的页面
		response.getWriter().write(
				"<a href='/JspDemo/Goodslist2.jsp'>继续购物</a>"
						+ "<a href='/JspDemo/cart.jsp'>去结算</a>");

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);

	}

}

对应的配制:


	
	<servlet>
		<description>This is the description of my J2EE component</description>
		<display-name>This is the display name of my J2EE component</display-name>
		<servlet-name>SeesionCookieDemo</servlet-name>
		<servlet-class>SeesionCookieDemo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>SeesionCookieDemo</servlet-name>
		<url-pattern>/servlet/SeesionCookieDemo</url-pattern>
	</servlet-mapping>



对应的商品显示列表


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'Goodslist.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

</head>

<body>
	This is my JSP page.
	<br>
	<img src="/JspDemo/img/1.jpg">
	<a href="/JspDemo/servlet/SeesionCookieDemo?id=1">手电</a>
	
	
	<img src="/JspDemo/img/2.jpg">
	<a href="/JspDemo/servlet/SeesionCookieDemo?id=2">手机</a>
	
	
	<img src="/JspDemo/img/3.jpg">
	<a href="/JspDemo/servlet/SeesionCookieDemo?id=3">电视</a>
	
	
	<img src="/JspDemo/img/4.jpg">
	<a href="/JspDemo/servlet/SeesionCookieDemo?id=4">冰箱</a>

</body>
</html>

对应的商品结算页面


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'cart.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">


</head>

<body>
	结算页面
	<br>
	<%
		/* 获取所有的session */
			Map<String,Integer > map = (Map<String,Integer >)request.getSession().getAttribute("cart");
			if(map==null){
	%>
	<h1>没有购物信息</h1>
	<%
		}else{
		//获取map中的商品名称和数量 
		Set<String> set = map.keySet();
		for(String name : set){
		   int  number  = map.get(name);
	%>
	<h1>
		商品名称:<%=name%>;购买数量 :<%=number%></h1>
	<%
		}
			}
	%>
</body>
</html>

5-3 session的创建、销毁和清空购物车


第一种:非正常关闭服务器

第二种:session默认的过期时间 30分钟

第三种:直接调用方法  invalidate()




web基础攻略之jsp开发(综述四)

标签:

原文地址:http://blog.csdn.net/zl18603543572/article/details/51010790

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!