javaWeb---Servlet


Servlet可以处理客户端传来的HTTP请求,并返回一个响应。

Servlet

(1)Servlet类需要继承类HttpServlet
(2)Servlet的父类HttpServlet中包含了几个重要方法,根据需要重写他们:

  • init():初始化方法,Servlet对象创建后,接着执行该方法。
  • doGet():当请求的类型是“get”时,调用该方法。
  • doPost():当请求的类型是“post”时,调用该方法。
  • service():Servlet处理请求时自动执行service()方法,该方法根据请求的类型(get或post),调用doGet()或doPost()方法,因此,在建立Servlet时,一般只需要重写doGet()和doPost()方法。
  • destroy():Servlet对象注销时自动执行。
    (3)Servlet编写好后,需要进行配置才能起作用,配置方法有xml(在web.xml中配置)和注解两种(新版本的Servlet和IDE主要使用后者),配置项有多个,其中访问地址(URL Mappings)是必不可少的。
public class Servlet 类名称 extends HttpServlet{
	public void init(){}
	public void doGet(HttpServletRequest request,HttpServletResponse response){}
	public void doPost(HttpServletRequest request,HttpServletResponse response){}
	public void service(HttpServletRequest request,HttpServletResponse response){}
	public void destroy(){}
}

Servlet(Web容器)
配置方法:

  • 注解
  • Web.xml

Servlet生命周期

初始化阶段

加载和实例化Servlet:

  • 当容器启动或首次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。加载成功后,容器会通过反射对 Servlet 进行实例化
  • 因为 Servlet 容器是通过 Java 的反射 API 来创建 Servlet 实例的,需要调用 Servlet 的默认构造方法(default constructor,即不带参数的构造方法),所以在编写 Servlet 类时,不能只提供一个带参数的构造方法

调用init()方法进行初始化:

  • 加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Servlet 实例。
  • 初始化的目的:让 Servlet 实例在处理请求之前完成一些初始化工作,例如建立数据库连接,获取配置信息等。
  • 在 Servlet 的整个生命周期内,init() 方法只能被调用一次。
  • 初始化期间,Servlet 实例可以通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。

运行时阶段

  • Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。
  • 在 service() 方法中,Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。
  • 在 Servlet 的整个生命周期内,对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象。即 service() 方法在 Servlet 的整个生命周期中会被调用多次。

销毁阶段

  • 当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调用 destory() 方法,释放该实例使用的资源,例如:关闭数据库连接,关闭文件的输入流和输出流等,随后该实例被 Java 的垃圾收集器所回收。
  • 每个 Servlet 实例来说,destory() 方法只能被调用一次。

load-on-startup元素

  • 它的取值必须是一个整数;
  • 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载;
  • 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该Servlet,取值越小,优先级越高
  • 当取值相同时,容器就会自行选择顺序进行加载。

Servlet、JavaBean、jsp的关系

  • JSP是页面,Servlet和JavaBean是类,JSP在执行时会先翻译成Servlet;
  • JavaBean供JSP或Servlet调用,不能独立运行。
  • 从功能上说,Servlet和Jsp是等价的,都可以用来执行代码处理客户端的请求,事实上Servlet出现早于Jsp,Servlet在输出页面内容时非常繁琐(用一系列的out.write()语句),为了克服这个缺点诞生了Jsp技术,但Servlet并没有因此退出历史舞台,Servlet侧重于代码设计,Jsp侧重于界面设计,两者各有所长,在一些开发模式中,如MVC模式,就充分利用两者的特点,让它们在开发中担任不同的角色。

Session和Cookie(面试常见)

Session

服务器保存
内存,持久化
保存登录信息
基于Cookie(SESSIONID)
浏览器关闭了第三方cookie怎么处理?

Cookie

客户端浏览器保存
保存账号密码
自动登录
只能存字符串
有长度限制
不安全

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {	
//		COOKIE
		Cookie co=new Cookie("user_name","zhansan");//只能存字符串。
		co.setMaxAge(7*24*60*60);//设置生效时间(7天)
		resp.addCookie(co);
		co=new Cookie("user_pass","123456");
		resp.addCookie(co);
		req.getSession().setAttribute("name", "123");
	}

Request和Response

Request请求对象:

req.getAttribute()
req.getParameter()
req.getParameterMap()
req.getParameterNames()
req.getParameterValues()
req.getCharacterEncoding()
req.getRequestDispatcher()

Response响应对象:

resp.getCharacterEncoding()
resp.getOutputStream()
resp.getWriter().write("");
resp.setCharacterEncoding();
resp.sendRedirect();

请求转发和重定向(面试常见)

转发:

JSP<jsp:forward page="文件的名字" />
Servlet:request.getRequestDispatcher("").forward(request,response);

重定向:

resp.sendRedirect("路径");

Get和Post(面试常见)

  • GET 和 POST 请求都是 http 的请求⽅式,⽤⼾通过不同的 http 的请求⽅式完成对资源(url)的不同操作。 GET ⼀般⽤于获取/查询资源信息,⽽ POST ⼀般⽤于更新资源信息 。
  • Get 请求提交的数据会在地址栏显⽰出来,⽽ post 请求不会再地址栏显⽰出来. GET 提交,请求的数据会附在 URL 之后(就是把数据放置在 HTTP 协议头中),以?分割 URL 和传输数据,多个参数⽤&连接; POST 提交:把提交的数据放置在是 HTTP 包的包体中,因此,GET 提交的数据会在地址栏中显⽰出来,⽽ POST 地址栏不会改变 。
  • 传输数据的⼤⼩ http Get 请求由于浏览器对地址⻓度的限制⽽导致传输的数据有限制。⽽ POST 请求不会因为地址⻓度限制⽽导致传输数据限制。
  • 安全性,POST 的安全性要⽐ GET 的安全性⾼。由于数据是会在地址中呈现,所以可以通过历史记录找到密码等关键信息。

Jsp+Servlet完成两个数的求和

输入页面:

<%@ page pageEncoding="UTF-8" %>
<html>
<body>
<form method="post" action="add">
输入第一个整数:<input type="text" name="n1"><br>
输入第二个整数:<input type="text" name="n2"><br>
<input type="submit" value="求和"/>
</form>
</body>
</html>

Servlet关键代码:

package servlet;
 
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;
 
@WebServlet("/add")
public class AddServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        int n1=Integer.parseInt(request.getParameter("n1"));
        int n2=Integer.parseInt(request.getParameter("n2"));
        String result=n1+"+"+n2+"="+(n1+n2);
        request.setAttribute("msg",result);
        request.getRequestDispatcher("/output.jsp").forward(request,response);    
    }
}

输出页面:

<%@ page pageEncoding="UTF-8" %>
<html>
<body>
${msg}
</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值