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