jsp笔记

<base href="<%=basePath%>">
//有它写的超链接相对于它,加“/”,相对于项目
//没有它相对于当前页面

<%     %>    相当于Java的方法
<%=     %>
<% !    %> 相当于Java的类
<%--  --%> jsp注释

jsp原理

jsp其实就相当于一个Servlet

在这里插入图片描述

案例:简易计算器

**主要练习参数传递,请求转发**

Servlet部分

public class AServlet extends HttpServlet {

	

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

		String s1 = request.getParameter("num1");
		String s2 = request.getParameter("num2");
		char f = request.getParameter("f").toCharArray()[0];
		int num1 = Integer.parseInt(s1);
		int num2 = Integer.parseInt(s2);
		int result = 0;
		System.out.println(f);
		switch(f){
		 case '+':
			result = jia(num1,num2);
			 break;
		 case '-':
			result = jian(num1,num2);
			 break;
		 case 'x':
			result = cheng(num1,num2);
			 break;
		 case '/':
			result =chu(num1,num2);
			System.out.println(f);
			 break;
		 default:
			 break;
		}
		
		
			request.setAttribute("result", result);
		
		
		RequestDispatcher rd = request.getRequestDispatcher("/test/a.jsp");
		rd.forward(request, response);
		
	}
	public int jia(int num1,int num2){
		return num1+num2;
	}
	public int jian(int num1,int num2){
		return num1-num2;
	}
	public int cheng(int num1,int num2){
		return num1*num2;
	}
	public int chu(int num1,int num2){
		return num1/num2;
	}
}

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 'a.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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  <%
  	String s;
  	Integer result = (Integer)request.getAttribute("result");
  	
  	if(result==null){
  		s = "";
  	}else{
  		s = "<input type='text' value='" + result.intValue() + "'/>" ;
  		
  	}
  	
   %>
    <form action="/day11_01/AServlet" method="post">
    	整数一<input type="text" name="num1"/><br/>
    	整数二<input type="text" name="num2"/><br/>
    	+<input type="radio" name="f" value="+">
    	-<input type="radio" name="f" value="-">
    	x<input type="radio" name="f" value="x">
    	÷<input type="radio" name="f" value="/"><br/>
    		<input type="submit" value="等于"/><br/>
    		<%=s %>
    </form>
  </body>
</html>

会话跟踪技术

我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。
在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束

Cookie

其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

在这里插入图片描述

格式:Cookie: a=A; b=B; c=C
设置:Set-Cookie(响应头): a=A
覆盖:Set-Cookie: a=A;第二次:Set-Cookie: a=AA,覆盖前一次的
cookie.setMaxAge(-1) 关闭浏览器删除
cookie.setMaxAge(0) 若有这个cookie直接删除
cookie.setMaxAge(60*60) 在硬盘上保存一个小时

案例:显示上次访问时间

<%@ 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 'b.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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <%	//创建Cookie
    	Cookie c1 = new Cookie("lasttime",new Date().toLocaleString());
    	//设置最大保存时间
    	c1.setMaxAge(60*60*24);
    	//添加
    	response.addCookie(c1);
    	//获取
    	Cookie [] cs = request.getCookies();
    	String s = "欢迎首次访问本站!";
    	if(cs!=null){
    		for(Cookie c:cs){
    			if("lasttime".equals(c.getName())){
    				s = "欢迎再次访问本站,上次访问时间为:" + c.getValue();
    			}
    		}
    	}
    	
     %>
     <h2><%=s %>></h2>
  </body>
</html>	

获取cookie

<%
    	Cookie[] c1 = request.getCookies();
    	for(Cookie c:c1){
    		response.getWriter().print(c.getName()+"="+c.getValue());
    	}
     %>

javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!

获取HttpSession对象

  • HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;
  • HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null;

  • HttpSession是域对象
    我们已经学习过HttpServletRequest、ServletContext,它们都是域对象,现在我们又学习了一个HttpSession,它也是域对象。它们三个是Servlet中可以使用的域对象。

  • HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据;
  • ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享;
  • HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;

  • session的实现原理
    session底层是依赖Cookie
    当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
    当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。

    URL重写
    我们知道session依赖Cookie,那么session为什么依赖Cookie呢?因为服务器需要在每次请求中获取sessionId,然后找到客户端的session对象。那么如果客户端浏览器关闭了Cookie呢?那么session是不是就会不存在了呢?
    其实还有一种方法让服务器收到的每个请求中都带有sessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为jSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时也服务器可以通过获取jSessionId这个参数来得到客户端的sessionId,找到sessoin对象。

    <a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>'
    请求注意,在index.jsp后面使用的是分号,而不是问号,这是服务器对jsessionid
    这个参数的特殊要求。] >主页</a>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值