HttpServletRequest
- 代表客户端的请求,用户通过Http协议访问服务器 HTTP请求中的所有信息会被封装到HttpServletRequest 通过这个HttpServletRequest的方法,获得客户端的信息
获取前端传递的参数并且请求转发
- req.getparamter()
- req.getparamterValues()
<%--
Created by IntelliJ IDEA.
User: My
Date: 2020/9/25
Time: 17:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center">
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="account" required><br>
密码:<input type="password" name="password" ><br>
爱好:
<input type="checkbox" name="hobbys" value="编程">编程
<input type="checkbox" name="hobbys" value="音乐">音乐
<input type="checkbox" name="hobbys" value="美术">美术
<input type="checkbox" name="hobbys" value="乒乓球">乒乓球
<br>
<input type="submit" value="提交" />
</form>
</div>
</body>
</html>
package com.wu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String account = req.getParameter("account");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("===================");
System.out.println(account);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
System.out.println("====================");
// resp.sendRedirect("/Servlet_03_war/success.jsp");
//servletContext.getRequestDispatcher("/content").forward(req,resp);
//通过请求转发 这里/ 代表当前路径
req.getRequestDispatcher("/success.jsp").forward(req,resp);
// resp.sendRedirect(req.getContextPath() +"/success.jsp");
// this.getServletContext().getRequestDispatcher("/success.jsp").forward(req,resp);
resp.setCharacterEncoding("utf-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Cookie
- 会话:用户打开一个浏览器 点击了很多链接 访问多个web资源 关闭浏览器 这个过程称之为会话
- 有状态会话:曾经来过
保持会话的两种技术
cookie: 客户端技术(响应 请求)
session:服务器技术 利用这个技术 可以保存会话信息. 把信息或者数据放在session中
//1.从请求中拿到cookie信息
//2.服务器响应给客户端cookie
- cookie:一般保存在本地 用户目录appdata
- 一个Cookie只能保存一条信息
- 一个web站点可以给浏览器发送多个cookie, 每个站点最多存放20个cookie
- cookie大小限制4kb
- 浏览器cookie上限300个
- 删除cookie : 将有效期设置为0
- 乱码问题:URLEncoder.encode() URLDecoder.decode() 谷歌浏览器中要设置resp.setHeader(“Content-Type”,“text/html;charset=utf-8”);
package com.wu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// req.setCharacterEncoding("utf-8");
// resp.setCharacterEncoding("utf-8");
resp.setHeader("Content-type","text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
//服务器从客户端中获取cookie
Cookie[] cookies = req.getCookies();
//判断cookie是否存在
if(cookies != null){
//如果存在 则取出cookie值
out.write("你上一次访问的时间是:");
for (int i = 0; i <cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("lastLoginTime")){
//获取cookie的值
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是你第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//cookie有效期 1天
lastLoginTime.setMaxAge(24*60*60);
resp.addCookie(lastLoginTime);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session(重点)
- 服务器会给每一个用户(浏览器)创建一个Session对象
- 一个Session独占一个浏览器 只要浏览器没有关闭 这个Seesion就存在
- 用户登录后 整个网站它都可以访问->保存用户的信息 保存购物车信息
//设置Session
package com.wu.servlet;
import com.wu.proj.Person;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获得Session
HttpSession session = req.getSession();
//Session中存东西
session.setAttribute("name",new Person("张三",29));
//获得Session给客户端分配的ID
String SessionId = session.getId();
//判断Session是否新创建
if(session.isNew()){
resp.getWriter().write("Session已经创建,ID为" + SessionId);
}else {
resp.getWriter().write("Session新创建ID为" + SessionId);
}
//Session创建时候所做的事情
// Cookie cookie = new Cookie("JSESSIONID", SessionId);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.wu.servlet;
//Session可以传递对象 自创建一个Person类
import com.wu.proj.Person;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDeamon extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
HttpSession session = req.getSession();
// String name = (String) session.getAttribute("name");
Person name = (Person) session.getAttribute("name");
resp.getWriter().write(name.getName() + name.getAge());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//注销Session(手动)
package com.wu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDeamon2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//web.xml配置session失效(自动)
<session-config>
<!--1分钟后Session失效-->
<session-timeout>1</session-timeout>
</session-config>
Cookie与Session区别
- Cookie是把用户的数据写给用户的浏览器 浏览器保存(可以多个)
- Session把用户的数据写到用户独占Session中, 用ID区分不同用户 用户数据在服务器端保存(保存重要信息 减少服务器资源浪费)
- Session对象由服务器创建
JSP
- java server page(java服务器端页面)和Servlet一样 用于开发动态web
- 最大特点
写JSP就像在写HTML
区别:
- HTML只给用户提供静态数据
- JSP页面中可以潜入JAVA代码 为用户提供动态数据
- JSP原理
服务器内部工作
tomcat中work目录
idea中目录
C:\Users\My\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_javaweb-02-servlset\work\Catalina\localhost\requestt_war\org\apache\jsp
浏览器向服务器发送请求 不管访问什么资源 其实都是在访问Servlet
JSP 最终也会被转换为一个JAVA类
JSP(extends HttpJspBase extends HttpServlet)本质上就是Servlet
//jsp初始化 public void _jspInit() { } //jsp销毁 public void _jspDestroy() { } //jsp service public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
判断请求
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { final java.lang.String _jspx_method = request.getMethod(); if ("OPTIONS".equals(_jspx_method)) { response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); return; } if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) { response.setHeader("Allow","GET, HEAD, POST, OPTIONS"); response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS"); return; } }
内置一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文 javax.servlet.http.HttpSession session = null; //session final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page 当前
输出页面前的代码
response.setContentType("text/html;charset=UTF-8");//设置响应页面类型 pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
以上对象可以在JSP页面中直接使用
JSP基本语法
//2个依赖包
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<%= java语句(变量或者表达式)%>
<%= new java.util.Date() %>
<% jsp脚本片段 %>
<% int sum=0; for (int i = 0; i <= 100; i++) { sum += i; } out.println("<h1>Sum:" +sum + "</h1>" ); %>
JSP声明<%! %>
<%! static { System.out.println("Loading Service!"); } private int globalvar=1; public void fun(){ System.out.println("globalvar=" + globalvar); } %>
声明会被编译到JSP生成JAVA类中 其他的 会被生成到 _jspService方法中
JSP指令<%@ page %>
<%@ page import="java.util.Date" %> <%@ page errorPage="error/error.jsp" %> <%@ include file="error/error.jsp"%> <jsp:include page="error/error.jsp" />
JSP 九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application [ServletContext] 存东西
- config [ServerletConfig]
- out
- page
- exception