小白学Java31:Servlet
准备工作:
- 如果使用的是eclipse需要切换到EE模式
- 安装好tomcat,并绑定到服务
开始学习
在Ecplise中新建一个servlet文件
package myServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class S1
*/
@WebServlet("/S1")
public class S1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public S1() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入后端");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
重点掌握内容
request请求常用方法
重要方法:
//request常用方法:
// 1.获取端口号
int serverPort = request.getServerPort();
// 2.获取上下文路径
String contextPath = request.getContextPath();
// 3.获取前端相应name的值
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println("端口号:" + serverPort);
System.out.println("项目路径:" + contextPath);
System.out.println("前端输入的name:" + name);
System.out.println("前端输入的passwold:" + password);
request.setCharacterEncoding("utf-8");//设置请求编码格式
Response响应常用方法
//response常用方法:
response.setContentType("text/html");//设置文本类型
response.setCharacterEncoding("utf-8");//设置响应编码
PrintWriter writer = response.getWriter();
writer.write("你们的浏览器有毒");//响应客户端
转发与重定向
转发
转发作用在服务器内部,将请求发送给服务器上的其他资源,以共同完成一次请求的处理
地址不变,方法的调用者与被调用者之间共享相同的request和response对象,属于同一个访问请求和响应过程
相当于把用户的请求接过来交给其他人去处理
request.getRequestDispatcher("转发.html").forward(request, response);
重定向
地址栏会改变,会发起多次请求
方法的调用者与被调用者使用各自的request和response对象,属于两个独立的访问请求和响应过程
相当于回应给了客户另外一个网址,让他去再次访问
response.sendRedirect("重定向.html");
Servlet的生命周期
- 实例化
只执行一次,创建时机受load-on-startup定义,正数为开始就加载,0或负数为需要时才加载, - 初始化
只执行一次 - 服务
执行多次 - 销毁
一次
三大作用域
request:
作用于web逐渐之中,在不同的Servlet之间传递信息,当用户请求时产生,处理完请求时结束
session:
一个客户端(浏览器)访问了服务器后,就产生了一个session 关闭浏览器时,客户就与session失去了关联,但并不意味着清楚session,达到一定条件后清除session,新开一个浏览器访问服务器就新建了一个session
application(ServletContext)
对所有客户端共i选哪个,web应用加载时就产生,Web应用关闭时消亡(统计访问量)
//获取方式1:通过this.getServletContext();
ServletContext servletContext = this.getServletContext();
//获取方式2:通过request.getServletContext();
ServletContext servletContext1 = request.getServletContext();
//获取方式3,通过session的getServletContext();
HttpSession session = request.getSession();
ServletContext servletContext2 = session.getServletContext();
ServletContext的作用
- 获取项目真实路径
String realPath = servletContext.getRealPath("/");
- 获取项目的上下文路径
String contextPath = servletContext.getContextPath();
- 全局容器
//存储数据
servletContext.setAttribute("name","value");
//获取数据
Object value = servletContext.getAttribute("name");
//移出数据
servletContext.removeAttribute("name");
作用域总结:
- request: 只在一次请求内有效
- Session:一次会话之内有效,浏览器关闭或超时失效
- ServletContext:服务器启动时开始,停止失效
Cookie(重点)
cookie是用来存储在客户端处用来保存状态信息的一小段代码,由信息的名称(name)和值(value)组成
创建cookie
//1服务器端创建Cookie
Cookie cookie = new Cookie("username", "张三");
//1.1设置cookie的访问路径,默认全都都可以访问
cookie.setPath("/T01/get");
//1.2设置cookie的有效期
cookie.setMaxAge(-1);//大于0,秒,等于0,浏览器关闭,小于0,浏览器内存存储
//2.将cookie响应给客户端
response.addCookie(cookie);
获取Cookie
// 1通过request.getCookies()获取所有的cookie
Cookie[] cookies = request.getCookies();
// 2做判断有没有cookie
if (cookies != null) {
// for循环遍历所有的cookie
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
修改Cookie
只要保证Cookie的名称和路径一直即可修改
当后面的cookie的名称和路径跟前面的Cookie一致时,会覆盖掉前面的cookie,有效期也会覆盖
Cookie编码与解码
Cookie默认不支持中文,只能包含AsCii字符
当我们在Cookie的name处需要用中文存储数据时需要用到编码和解码
//在创建cookie的时候使用URLEEncoder.encode(name,编码格式)进行编码
Cookie cookie = new Cookie(URLEncoder.encode("姓名", "utf-8"), "张三");
//在解析cooki e的时候使用URLDecoder.decode(name, "utf-8")
System.out.println(URLDecoder.decode(cookie.getName(), "utf-8") + ":" + cookie.getValue());
Session(重点)
session是由服务器端创建的
用于在服务器端记录用户的状态,记录了一段时间内,单个客户端与web服务器的一连串的相关的交互过程
在一个SEssion中客户可能会多次请求访问同一个资源,也有可能请求访问不同的服务器资源
Session原理
服务器会为每一次绘画分配一个session对象
同一个浏览器发起的多次请求,同属于一次会话
首次使用到session时,服务器会自动创建session,并创建cookie存储session ID发送回客户端
获取session
HttpSession session = request.getSession();
System.out.println(session.getId());
使用session保存数据
HttpSession session = request.getSession();
session.setAttribute("username", "张飞");
使用session获取数据
HttpSession session = request.getSession();
String s = (String) session.getAttribute("username");
System.out.println("从Session中获取的值为:" + s);
使用session移出数据
HttpSession session = request.getSession();
session.removeAttribute("username");
session跟request的区别
request是一次请求有效,请求改变则request改变
session是一次会话有效,浏览器改变,则session改变
Session的生命周期
- 开始:第一次使用到session的请求产生,则创建session
- 结束:
-
浏览器关闭则失效
-
Session超时失效
session.setMaxInactiveInterval(S)
;设置最大有效时间
-
手工销毁失效
session.invalidate()
登录退出,注销
-
session失效的三种方式
- 浏览器关闭
- Session超时
session.setMaxInactiveInterval(10);//单位秒
- 手工销毁
session.invalidate();
了解知识点:浏览器禁用cookie的解决方案
当浏览器禁用了Cookie,无法在本地存储与服务器端交互的SessionID时,需要通过URL重写的方式,在客户的URL里添加上SessionID
实现URL重写
String newURL = response.encodeRedirectURL("/T01/Tetst");
response.sendRedirect(newURL);
过滤器
过滤器是出于客户端与服务器目标资源之间的一道过滤技术
过滤器的作用
可以解决多个servlet共性代码的冗余问题(乱码处理,登陆验证)
编写过滤器
- 编写Java类实现Filter接口
- 在doFilter方法中编写拦截逻辑
- 设置拦截路径
package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* Servlet Filter implementation class F1
*/
@WebFilter("/t") // 设置拦截目标资源的名称
public class F1 implements Filter {
/**
* Default constructor.
*/
public F1() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("MyFilter");// 设置拦截逻辑
// pass the request along the filter chain
chain.doFilter(request, response);// 向下传递request和response
System.out.println("end");// 设置响应逻辑
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}