JavaWeb基础总结之Servlet(一)

Http:常见响应码:

  • 200:请求成功
  • 302/307:请求的资源变更
  • 304:请求资源未变更
  • 404:请求资源不存在
  • 500:服务器程序存在错误

Servlet:是SUN制定的一套开发动态Web页面的规范。它是JavaEE技术中的一种。Tomcat服务器实现了Servlet规范。

servlet的三种实现方式:

  • 实现javax.servlet.Servlet
  • 继承javax.servlet.GenericServlet类
  • 继承javax.servlet.http.HttpServlet类

(1)实现javax.servlet.Servlet接口:

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo implements Servlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init...");
	}
	@Override
	public ServletConfig getServletConfig() {
		return null;
	}
	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		System.out.println("service...");

	}
	@Override
	public String getServletInfo() {
		return null;
	}
	@Override
	public void destroy() {
		System.out.println("destory...");
	}

}

Servlet接口中有五个方法,其中生命周期的方法有三个:init(),service(),destory()。init()方法在第一次请求某一个servlet初始化。service()方法在每次请求该servlet时都会调用,destory()方法在对象销毁时调用。这里需要注意的是。Servlet类是由程序员写的,但是对象是由服务器创建的,并且由服务器调用相应的方法。

(2)继承javax.servlet.GenericServlet类:

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo3 extends GenericServlet {

	private static final long serialVersionUID = 1L;
	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		System.out.println("GenericServlet service...");
	}

}

GenericServlet类是一个抽象类,抽象方法为service方法,实际上我们继承了该类之后只要重写service方法即可以实现Servlet。

(3)继承javax.servlet.http.HttpServlet类:(最常见的)。HttpServlet类是GenericServlet类的子类,提供了如下的请求方式:

供客户端请求,实际上提供那么多种请求方法名(GET,POST,DELETE等)的初衷是判断请求的逻辑可以通过不同的方法名进行辨析,也就是当前的restful风格,但是大多数的开发者实际上还是使用POST,GET请求方式就取代了上述的这些方式,所以实际的开发中,如果你没有采用restful风格的开发,你只需要重写doGet和doPost方法即可。

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;

public class ServletDemo4 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

默认情况下,服务器会在某一个Servlet第一次收到请求时创建他,当然也可以在web.xml对servlet进行配置,使服务器启动时就可以创建他(注意这里仅仅指的是servlet对象被创建,而不是被请求,所以要看到明显的效果就是在init()方法中做一些输出即可,下面在servletDemo中加上启动服务器就创建的语句):

这样在服务器启动的时候,该对象就会被创建,创建的时候也就执行了init()方法:

这里切记不要在继承GenericServlet类的时候加上该语句查看是否创建,因为该类的init()方法中是默认的空操作:这个要注意。除非你重写init()方法。

重写init方法:

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo3 extends GenericServlet {

	private static final long serialVersionUID = 1L;
	@Override
	public void init() throws ServletException {
		System.out.println("重写GenericServlet类的init()方法...");
	}
	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		System.out.println("GenericServlet service...");
	}

}

服务器启动时,控制台结果:

Servlet中的初始化参数获取:当servlet配置了初始化参数之后,web容器(如tomcat)在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给Servlet。进而,程序员通过Servlet对象得到当前servlet的初始化参数信息。

私有的初始化参数获取:

在init()方法中只需要通过下面语句获得即可:

System.out.println(this.getInitParameter("name"));

或者是:

System.out.println(this.getServletConfig().getInitParameter("name"));

可以看出,得到servlet私有的初始化参数是通过得到ServletConfig对象,然后再从该对象中取到对应的值的。

公共的初始化参数获取:

在init()方法中只需要通过以下语句即可得到公共初始化参数:

System.out.println(this.getServletContext().getInitParameter("hello"));

可以看出,得到公共的初始化参数是通过得到ServletContext对象,然后再从中获取对应的值的。 

JavaWeb的四大域对象:

  • pageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。
  • ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束
  • HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session还是存在的。否则Session不存在。  如果JavaBean 数据在session钝化时,没有实现Serializable 则当Session活化时,会消失。
  • ServletContext:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。
  • 总结如下:

PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。

所有域对象都有存取数据的功能,因为域对象内部有个map存储结构存储数据,下面以ServletContext对象具有的方法为例作简单总结:

  • void setAttribute(String name,Object value)将数据按键值对放入map,但是名字相同会被覆盖。
  • Object getAttribute(String name)取数据,需要注意的是这个函数返回的是对象,所以在获取其对应的String时,要做相应的数据强制转换为String。
  • void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么该方法什么也不做。
  • Enumeration getAttributeNames():获取所有域属性的名称。

注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教。

猜你喜欢

转载自blog.csdn.net/m0_37265215/article/details/82955455
今日推荐