04、JavaWeb-JSP+Session+Cookie
JavaWeb JSP
JSP-01
只有Servlet能够跟客户端做响应
当访问jsp时候,可以自动的将jsp转换为servlet,将jsp中的html代码全部拷贝出来,自动生成一个servlet
既然jsp文件和html文件都能给出前段页面,那么我为什么 还要把html写进jsp,再把jsp转换为servlet资源传给客户端。因为就是想把java代码加进去,因为原生的html代码是无法在里面写java代码的。访问.html没有用,因为不能把java的数据加载进来,只有在jsp中才可以穿插java代码。
JSP本质上就是一个Servlet,JSP主要负责与用户交互,将最终的界面呈现给用户,HTML+JS+CSS+JAVA的混合文件
当服务器接收到一个后缀是JSP的请求时,将该请求交给JSP引擎去处理,每一个JSP页面第一次被访问的时候,JSP引擎会将它翻译成一个servlet文件,再由web容器调用Servlet完成响应。单纯从开发角度来看JSP就是在html中嵌入java程序
具体嵌入方式有三种
1.<% Java代码 %>
2.<%! Java方法 %>
3.<%=Java变量 %> //把Java对象直接输出到HTML页面中
Java代码在jsp文件中的不同区域,看似隔断,实际上是一片连续的java代码区域,最终都会放到Servlet的service方法中去
Jsp-02
index2.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: Admin
Date: 2022/1/4
Time: 9:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index2</title>
<h1> test index2 path in "http://localhost:port/index2.jsp" </h1>
<h1> test index3 path in "http://localhost:port/index3.jsp" </h1>
<h1> test index4 path in "http://localhost:port/index4.jsp" </h1>
</head>
<body>
<h1> test index2 path in "http://localhost:port/index2.jsp" </h1>
<h1> test index3 path in "http://localhost:port/index3.jsp" </h1>
<h1> test index4 path in "http://localhost:port/index4.jsp" </h1>
<HR>
<%
String str = "hello world";
System.out.println(str);
//hello world不会显示在客户端的浏览器中,而是显示在控制台
%>
<%--写进标签中的东西在浏览器页面上才能看到--%>
<h1>hello world!</h1>
<h1>写进标签中的东西在浏览器页面上才能看到</h1>
<h1>System.out.println("hello world")不会显示在客户端的浏览器中,而是显示在控制台</h1>
<HR>
<HR align=center width=300 color=#b92600 SIZE=1>
<h3>声明一个java方法并调用,在控制台输出hello world,System.out.println只能输出到控制台,不能输出到前段页面</h3>
<h3>要想在前端页面展示hello world,需要通过html标签输出</h3>
<%!
//声明一个Java方法
public String test() {
return "测试JSP中的java方法";
}
%>
<%
//调用Java方法
System.out.println(test());
%>
<HR align=center width=300 color=#b92600 SIZE=1>
<h3>老笨办法,一行一行标签敲出来的表格</h3>
<%
List<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.add("王五");
List<Integer> ages = new ArrayList<>();
ages.add(22);
ages.add(21);
ages.add(23);
%>
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<tr>
<td>
<%--看!html标签获取java变量来了--%>
<%=names.get(0)%>
</td>
<td>
<%=ages.get(0)%>>
</td>
</tr>
<tr>
<td>
<%=names.get(1)%>
</td>
<td>
<%=ages.get(1)%>>
</td>
</tr>
<tr>
<td>
<%=names.get(2)%>
</td>
<td>
<%=ages.get(2)%>>
</td>
</tr>
</table>
<HR>
<HR align=center width=300 color=#b92600 SIZE=1>
<h3>通过java代码和html标签混合编程循环遍历输出表格</h3>
<table>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
for (int i = 0; i < names.size(); i++) {
%>
<tr>
<td>
<%=names.get(i)%>
</td>
<td>
<%=ages.get(i)%>>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
效果
JSP-03
jsp内置对象9个
request:表示一次请求,和HttpServletRequest同一个类型
response:表示一次响应,和HttpServletResponse同一个类型
pageContext:页面上下文,获取页面信息,该类来自于pageContext,Servlet有上下文ServletContext
session:表示一次会话,保存用户信息,来自于HttpSession类
application: ServletContext的实例,表示当前的web应用,是个全局的对象,保存所有用户的共享信息
config: 表示当前JSP转换完成的对应的Servlet的ServletConfig对象,可以获取当前Servlet的信息
out: JspWriter对象,向客户端浏览器输出数据,也可以用jsp表达式向客户端浏览器输出信息。
page:当前Jsp对应的Servlet对象
exception:表示JSP页面发生异常
常用的是 request、response、session、application、pageContext
request常用方法
1、String getParameter(String key)获取客户端传来的参数。
2、void setAttribute(String key,Object value)通过键值对的形式保存数据。
3、Object getAttribute(String key)通过key取出value。
4、RequestDispatcher getRequestDispatcher(String path)返回一个RequestDispatcher对象该对象的forward方法用于转发请求
5、String[] getParameterValues()获取客户端传来的多个同名参数
6、void setCharacterEncoding(String charset) 指定每个请求的编码
index3.jsp
<%@ page import="java.util.Arrays" %><%--
Created by IntelliJ IDEA.
User: Admin
Date: 2022/1/6
Time: 14:00
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index3.jsp</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");//指定每个请求的编码
String idStr = request.getParameter("id");
Integer id = null;
Integer id2 = null;
try {
//这个请求的时候,没有带id参数会可能会导致Integer.parseInt(null)抛出异常
id = Integer.parseInt(idStr);
} catch (Exception e) {
id = null;
}
String name = request.getParameter("name");
String[] names = request.getParameterValues("name");
String age = request.getParameter("age");
//----------------------
out.write("在jsp中 out.write(\"xxxx\") ");
Class clazz = page.getClass();
String id1 = (String) pageContext.getAttribute("id");
//-----------------------
//将数据存入request中
try {
request.setAttribute("id2", id + 2);
} catch (Exception e) {
request.setAttribute("id2", null);
}
//数据数据转到index4.jsp中,同事页面也跳转到index4.jsp
//RequestDispatcher requestDispatcher = request.getRequestDispatcher("index4.jsp");
//requestDispatcher.forward(request,response);
//-----------------------
%>
<h3>eg: http://localhost:8080/index3.jsp?id=1&name=2&age=3 //常规传参</h3>
<h3>eg: http://localhost:8080/index3.jsp?name=2&name=3&name=4&name=abc&age=3 //不传id也可以</h3>
<h3>eg: http://localhost:8080/index3.jsp?&name=value1&name=value2&name=value3 //同名参数传多值</h3>
<h5>
您访问的时候所带的参数是:<br/>
你请求的地址为:http://localhost:8080/index3.jsp?id=<%=id%>&name=<%=name%>&age=<%=age%>
</h5>
<p>---------------------------------------------------------------------</p>
<p>无论请求的时候给的name参数的值有几个,总是第一个值是有效的,这叫做近水楼台先得月</p>
<p>假设:</p>
<p>http://localhost:port/index3.jsp?&name=value1&name=value2&name=value3</p>
<p>此时,name参数的值一直是value1</p>
<p>String name = request.getParameter("name");//value1</p>
<p>如果,我就要一次性给同一个参数传递多个不同的值,某些场景可能需要</p>
<p>String[] names=request.getParameterValues("name");</p>
<br/>
<p>---------------------------------------------------------------------</p>
<p>id参数传来的值:<%=id%>
</p>
<p>id1:<%=id1%>
</p>
<p>id+2:<%=id2%>
</p>
<p>age参数:<%=age%>
</p>
<p>name参数的第一个值,作为默认值:<%=name%>
</p>
<p>name参数的多个值:<%=Arrays.toString(names)%>
</p>
<%=clazz%>
<p>---------------------------------------------------------------------</p>
<p>
数据数据转到index4.jsp中,同时页面也跳转到index4.jsp <br/>
RequestDispatcher requestDispatcher = request.getRequestDispatcher("index4.jsp");<br/>
requestDispatcher.forward(request, response);<br/>
</p>
</body>
</html>
servlet06.java
@WebServlet("/servlet06")
public class Servlet06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 地址栏发送的请求是get请求
// http://localhost:8080/servlet06?id=1&name=%E5%BC%A0%E4%B8%89&age=23
response.getWriter().write("HtteServlet doGet");
String id = request.getParameter("id");
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println("http://localhost:port/servlet06?id=" + id + "&name=" + name + "&age=" + Integer.parseInt(age));
// http://localhost:port/servlet06?id=1&name=寮犱笁&age=23
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//如果想要客户端发送post请求,要么写一个表单发送,要么用postman等工具发送post请求
response.getWriter().write("HtteServlet doPost");
}
}
JSP-04
Session
用户会话
服务器无法识别每一次HTTP请求的出处(不知道来自于哪个终端),它只会接受到一个请求信号,所以就存在一个问题:将用户的响应发送给其他人,必须有一种技术来让服务器知道请求来自哪,这就是会话技术。
会话:就是客户端和服务器之间发生的一系列连续的请求和响应的过程,打开浏览器进行操作到关闭浏览器的过程。
会话状态∶指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的一系列请求和响应关联起来。
实现会话的两种方式:
- Session
- Cookie
属于同一次会话的请求都有一个相同的标识符,sessionlD
session常用的方法:
String getld() 获取sessionID
void setMaxInactivelnterval(int interval) 设置session的失效时间,单位为秒
int getMaxInactivelnterval() 获取当前session的失效时间,默认失效时间 1800s
void invalidate() 设置session立即失效
void setAttribute(String key,Object value) 通过键值对的形式来存储数据,request也可以存储
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据
a标签触发退出登录,退出登录的逻辑是Servlet08写的,所以“/servlet08”得写一样了
Cookie
创建Cookie
Cookie cookie = new Cookie( "name" ,"tom");
response. addcookie ( cookie) ;
读取cookie
Cookie[] cookies=request.getCookies();
for (Cookie cookie1 : cookies) {
//因为out.write只能写String类型的,所以,把cookie toString一下
int i=1;
out.write("cookie"+i+" "+cookie1.toString()+":\t"+cookie1.getName()+"="+cookie1.getValue()+"<br/>"); i++;
}
Cookie常用的方法:
void setMaxAge(int age) 设置Cookie的有效时间,单位为秒
intgetMaxAge() 获取Cookie的有效时间
String getName() 获取Cookie 的name
String getValue() 获取Cookie的value
session:
保存在服务器
保存的数据是Object
会随着会话的结束而销毁
保存重要信息
存储用户信息;
session: setAttribute("name" ,"admin"")存
getAttribute(""name"")取生命周期:
服务端:只要WEB应用重启就销毁,客户端:只要浏览器关闭就销毁。
cookie:
保存在浏览器
保存的数据是String
可以长期保存在浏览器中,无会话无关
保存不重要信息
典型的应用:biblibili保存你观看的视频进度,下次打开从上次关闭的位置继续观看。
存cookie: response.addCookie(new Cookie(name,"admin")
取cookie:
Cookie[ ] cookies = request.getcookies() ;
for (cookie cookie:cookies){
if(cookie.getName( ).equals ( "nane" )){
out.write("欢迎回来"+cookie.getvalue( ) );
}
}
生命周期:
不随服务端的重启而销毁,客户端:默认是只要关闭浏览器就销毁,我们通过setMaxAge()方法设置有效期,一旦设置了有效期,则不随浏览器的关闭而销毁,而是由设置的时间来决定。
问题:
打开idea的Event Log查看其被占用的端口号,我这里是xxx
打开cmd
netstat -ano|findstr xxx //获取进程号
taskkill -f -pid yyy //杀死进程
更多推荐
所有评论(0)