Java Web-Servlet入门详解

一、什么是Servlet

  • Servlet简介
    ervlet ( Server Applet )是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

二、Servlet的生命周期

2.1 Servle生命周期阶段

  • 初始化阶段调用init()方法
  • 响应客户请求阶段调用service()方法
  • 终止阶段调用destroy0方法

2.2 Servlet生命周期原理

在这里插入图片描述
在这里插入图片描述

  • 新建一个LifeServlet,包含doGet()和doPost()方法

在这里插入图片描述

  • response.getWriter( ):获得PrintWriter对象,用于向网页输出字符

  • request.getContextPath( ):获取servlet访问路径中的工程名部分,即/dmj_ servlet1

  • 因此,Servlet主要用于业务逻辑处理,JSP用于展示内容。

  • 新建LifeServlet类,在中加入以下三个方法:

在这里插入图片描述

package com.dmj.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
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("/LifeServlet")
public class LifeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("Servlet的init()方法");
	}

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		System.out.println("Servlet被请求了");
	}

	@Override
	public void destroy() {
		System.out.println("Servlet被销毁了");
	}
	
}

  • 此时,可以看出第一次打印,init()只调用一次,每次访问请求都会调用service()方法,destroy()只有被销毁的时候才会被调用,并不是关了tomcat服务器,而是将工程从服务器中remove(移除)。

在这里插入图片描述

  • 这就是Servlet生命周期的三个阶段。

三、HttpServletRequest(请求)与HttpServletResponse(响应)

  • 浏览器对服务器的一次访问称之为一次请求,请求用HttpServletRequest对象来表示

  • 服务器给浏览器的一次反馈称之为一次响应,响应用HttpServletResponse对象来表示

在这里插入图片描述

四、ServletContext与ServletConfig

4.1 概念

  • java是一门面向对象的语言,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。
  • 我们可以在web.xml文件中给某一个Servlet配置一 些配置信息,当服务器被启动的时候,这些配置信息就会被封装到某一个ServletConfig对象中去。 因此ServletConfig表示的是某一个Servlet的配置文件

4.2 ServletContext 案例

  • ServletContext对象:表示的是整个JavaWeb工程
  • 在一个包中创建两个servlet,Demo1Servlet和Demo2Servlet,一个存放数据,一个取出数据
  @WebServlet("/Demo1Servlet")
  public class Demo1Servlet extends HttpServlet {
  	private static final long serialVersionUID = 1L;
  
  	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		//获取代表某一个JavaWeb工程的ServletContext对象
  		//Context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放的数据
  		ServletContext context = this.getServletContext();
  		//往context域对象中存放数据
  		context.setAttribute("username", "张三");
  		//取出context域对象中的数据
  		Object result = context.getAttribute("username");
  		//打印取出的结果
  		System.out.println(result);
  	}
  
  	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		doGet(request, response);
  	}
  
  }

运行结果,控制台显示:
在这里插入图片描述

  • context可以代表整个工程,因此往某个context里面存放的数据可以在其他servlet里面取出来
  @WebServlet("/Demo2Servlet")
  public class Demo2Servlet extends HttpServlet {
  	private static final long serialVersionUID = 1L;
  
  	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		ServletContext context = this.getServletContext();
  		//取出key=username所对应的值
  		Object result = context.getAttribute("username");
  		System.out.println(result);
  	}
  
  	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		doGet(request, response);
  	}
  }

运行结果,控制台先清除存放的数据,再取出数据
在这里插入图片描述

4.3 ServletConfig案例

  • ServletConfig对象:表示的是某一个Servelt中的配置文件

  • 之前配置对外的虚拟路径是通过注解,下面通过xml配置文件来进行配置,在web.xml中添加代码并且设值一些信息:名字encoding、值utf-8。当servlet被启动,这两个参数就会被封装到ServletConfig对象中

  <servlet>
      <servlet-name>Demo3Servlet</servlet-name>
      <servlet-class>com.dmj.servlet.Demo3Servlet</servlet-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
      </init-param>
    </servlet>
    <servlet-mapping>
      <servlet-name>Demo3Servlet</servlet-name>
      <url-pattern>/Demo3Servlet</url-pattern>
    </servlet-mapping>
  • 新建一个servlet,Demo3Servlet,需要注意的是:@WebServlet("/Demo3Servlet")得注释掉,不然tomcat将启动失败。
  //@WebServlet("/Demo3Servlet")
  public class Demo3Servlet extends HttpServlet {
  	private static final long serialVersionUID = 1L;
       
  	protected void doGet(HttpServletRequest request, HttpServletResponse response)
  			throws ServletException, IOException {
  		//首先需要获取ServletConfig对象
  		ServletConfig sc = this.getServletConfig();
  		//获取sc这个对象中封装的信息
  		String encoding = sc.getInitParameter("encoding");
  		//打印结果
  		System.out.println("encoding="+encoding);
  	}
  
  	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		doGet(request, response);
  	}
  }
  • 运行结果,控制台输出:

在这里插入图片描述

五、转发与重定向

  • 转发与重定向都是实现页面的跳转,也就是说,当我们访问一个servlet的时候,servlet帮我们跳转到另一个JSP页面,跳转就需要转发与重定向来实现。

5.1 转发与重定向的区别

  • 实现转发调用的是HttpServletRequest对象中的方法;
    实现重定向调用的是HttpServletResponse对象中的方法
  • 转发时浏览器中的url地址栏不会发生改变;
    重定向时浏览器中的url地址会发生改变
  • 转发时浏览器只请求一次服务器;
    重定向时浏览器请求两次服务器

5.2 页面跳转例子说明

//通过转发实现跳转
if ("admin".equals(username)&&"123".equals(password)) {
	request.getRequestDispatcher("/success.jsp").forward(request, response);
}else {
	request.getRequestDispatcher("/fail.jsp").forward(request, response);					
}
  • 重定向有个特点,需要加入工程名:/dmj_servlet1
//通过重定位实现跳转
if ("admin".equals(username)&&"123".equals(password)) {
	response.sendRedirect("/dmj_servlet/success.jsp");
}else {
	response.sendRedirect("/dmj_servlet1/fail.jsp");
}

5.3 跳转页面带数据例子

5.3.1 转发

  • 新建一个Demo4Servlet
  @WebServlet("/Demo4Servlet")
  public class Demo4Servlet extends HttpServlet {
  	private static final long serialVersionUID = 1L;
        
  	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		//转发带数据给某个JSP页面
  		request.setAttribute("username", "李四");
  		request.getRequestDispatcher("/demo.jsp").forward(request, response);
  	}
  	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
  			throws ServletException, IOException {
  		doGet(request, response);
  	}
  }
  • 新建一个demo.jsp
  <title>转发与重定向获取数据</title>
  </head>
  <body>
  <!--   取出Demo4Servlet中传递过来的数据 -->
     <%
        String username = (String)request.getAttribute("username");
        out.print(username);
     %>
  </body>
  • 运行结果:

在这里插入图片描述

5.3.2 重定位

  • 新建一个Demo4Servlet
//重定位带数据给某个JSP页面
ServletContext sc = request.getServletContext();
sc.setAttribute("username", "dmj");
response.sendRedirect("/dmj_servlet1/demo.jsp");
  • 新建一个demo.jsp
<%
   String username = (String)application.getAttribute("username");
   out.print(username);
%>
  • 运行结果:
    在这里插入图片描述

六、总结

以上内容是我目前正在学习Java Web做的笔记,在此过程中也有理解以及记录得不到位。如有错误之处,欢迎大家指正,随着知识的存储,以后会对内容进行补充和完善。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值