小白学Java31:Servlet

准备工作:

  1. 如果使用的是eclipse需要切换到EE模式
  2. 安装好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的生命周期

  1. 实例化
    只执行一次,创建时机受load-on-startup定义,正数为开始就加载,0或负数为需要时才加载,
  2. 初始化
    只执行一次
  3. 服务
    执行多次
  4. 销毁
    一次

三大作用域

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的作用
  1. 获取项目真实路径
String realPath = servletContext.getRealPath("/");
  1. 获取项目的上下文路径
String contextPath = servletContext.getContextPath();
  1. 全局容器
//存储数据
 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失效的三种方式

  1. 浏览器关闭
  2. Session超时
session.setMaxInactiveInterval(10);//单位秒
  1. 手工销毁
session.invalidate();

了解知识点:浏览器禁用cookie的解决方案

当浏览器禁用了Cookie,无法在本地存储与服务器端交互的SessionID时,需要通过URL重写的方式,在客户的URL里添加上SessionID

实现URL重写

String newURL = response.encodeRedirectURL("/T01/Tetst");
response.sendRedirect(newURL);

过滤器

过滤器是出于客户端与服务器目标资源之间的一道过滤技术

过滤器的作用

可以解决多个servlet共性代码的冗余问题(乱码处理,登陆验证)

编写过滤器

  1. 编写Java类实现Filter接口
  2. 在doFilter方法中编写拦截逻辑
  3. 设置拦截路径
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
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值