servlet_抛开框架,还原本质

   servlet是什么?

   百度百科解释一堆:

servlet 是在服务器上运行的小程序。这个词是在 Java applet 的环境中创造的

看着有点绕,个人认为servlet是java对rfc2616协议的封装,既是http协议的java封装.一个java类附rfc2616文档

根据红薯的文章,在myeclipse下测试,

1,新建web project;

2,xml添加servelt配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	  
  <servlet>
  	<servlet-name>ServletTest</servlet-name>
  	<servlet-class>TestS</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>ServletTest</servlet-name>
  	<url-pattern>/ServletTest</url-pattern>
  </servlet-mapping>
  
</web-app>

凡符合url-pattern中/ServletTest的请求,转由servlet-class对应的类TestS处理

servlet下servlet-name和servlet-mapping下servlet-name必须相同

3,TestS类:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestS extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		//super.doGet(req, resp);
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		out.print("你好,HELLO");
		out.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}

}

开启tomcat,访问http://localhost:8080/工程名/ServletTest

页面返回:

你好,HELLO

filter:

web.xml中servlet前添加:

<filter>
        <filter-name>helloFilter</filter-name>
        <filter-class>HelloFilter</filter-class>
    </filter>
 
    <filter-mapping>
        <filter-name>helloFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

创建HelloFilter.java文件

import java.io.IOException;

import javafx.collections.ListChangeListener.Change;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


public class HelloFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory filter");
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("do filter");
		//arg2.doFilter(arg0, arg1);
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init filter");
	}

}

重启tomcat,

控制台在启动tomcat过程打印:init filter

控制台在关闭tomcat过程打印:destory filter

通过浏览器访问http://localhost:8080/工程名/ServletTest,页面没有任何输出,http请求被过滤器拦截,(这也就是过滤器的含义,过滤器也拦截操作HttpServletRequest和HttpServletResponse)控制台打印:do filter

反注释//arg2.doFilter(arg0, arg1);

通过浏览器访问http://localhost:8080/工程名/ServletTest,页面输出"你好,HELLO",http请求被过滤器拦截控制台打印:do filter

----------------------分割线-----------------------------------

修改HelloServlet类,

dopost方法内部调用doget,

doget方法内部同时调用dopost,代码如下:

package demo;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		out.print("你好,HELLO");
		out.close();
		System.out.println("doGet function execute!");
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doGet(req, resp);
	}

	
}

做个死循环,是否会报错?测试下哈:

访问正常,控制台打印:"do filter",页面正常显示"你好,HELLO",

意料之外的是控制台没有打印"doGet function execute!",死循环也不产生作用,没有报错.


你可能感兴趣的:(servlet_抛开框架,还原本质)