tomcat之servlet

servlet之Servlet虚拟路径

1.在web/WEB-INF/web.xml 中设置:

 //将 cn.itcast.web.servlet.ServletDemo1虚拟路径设置为(demo1)
 <servlet> 
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

2在 Servlet3.0和之后的版本中设置 @WebServlet(“虚拟路径”)
一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
*

@WebServlet({"/demo1"})
public class ServletDemo1 implements Servlet {
    public ServletDemo1() {
    }

    public void init(ServletConfig servletConfig) throws ServletException {
    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo1....");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
    }
}

servlet之 生命周期

         1. 被创建:执行init方法,只执行一次
			* Servlet什么时候被创建?
				* 默认情况下,第一次被访问时,Servlet被创建
				* 可以配置执行Servlet的创建时机。
					* 在<servlet>标签下配置
						1. 第一次被访问时,创建
	                		* <load-on-startup>的值为负数
			            2. 在服务器启动时,创建
			                * <load-on-startup>的值为0或正整数


			* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
				* 多个用户同时访问时,可能存在线程安全问题。
				* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

		2. 提供服务:执行service方法,执行多次
			* 每次访问Servlet时,Service方法都会被调用一次。
		3. 被销毁:执行destroy方法,只执行一次
			* Servlet被销毁时执行。服务器关闭时,Servlet被销毁
			* 只有服务器正常关闭时,才会执行destroy方法。
			* destroy方法在Servlet被销毁之前执行,一般用于释放资源

servlet之 体系结构


Servlet的体系结构	
		Servlet -- 接口
			|
		GenericServlet -- 抽象类
			|
		HttpServlet  -- 抽象类

		* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
			* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

		* HttpServlet:对http协议的一种封装,简化操作
			1. 定义类继承HttpServlet
			2. 复写doGet/doPost方法
		

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package cn.itcast.web.servlet;

import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

@WebServlet({"/demo2"})
public class ServletDemo2 extends GenericServlet {
    public ServletDemo2() {
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("demo2.....");
    }
}

@WebServlet({"/demo3"})
public class ServletDemo3 extends HttpServlet {
    public ServletDemo3() {
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet....");
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}


servlet之http

http

## HTTP:
	* 概念:Hyper Text Transfer Protocol 超文本传输协议
		* 传输协议:定义了,客户端和服务器端通信时,发送数据的格式
		* 特点:
			1. 基于TCP/IP的高级协议
			2. 默认端口号:80
			3. 基于请求/响应模型的:一次请求对应一次响应
			4. 无状态的:每次请求之间相互独立,不能交互数据

		* 历史版本:
			* 1.0:每一次请求响应都会建立新的连接
			* 1.1:复用连接




	

请求头

	* 请求消息数据格式
		1. 请求行
			请求方式 请求url 请求协议/版本
			GET /login.html	HTTP/1.1

			* 请求方式:
				* HTTP协议有7中请求方式,常用的有2* GET:
						1. 请求参数在请求行中,在url后。
						2. 请求的url长度有限制的
						3. 不太安全
					* POST:
						1. 请求参数在请求体中
						2. 请求的url长度没有限制的
						3. 相对安全
		2. 请求头:客户端浏览器告诉服务器一些信息
			请求头名称: 请求头值
			* 常见的请求头:
				1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
					* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

				2. Referer:http://localhost/login.html
					* 告诉服务器,我(当前请求)从哪里来?
						* 作用:
							1. 防盗链:
							2. 统计工作:
		3. 请求空行
			空行,就是用于分割POST请求的请求头,和请求体的。
		4. 请求体(正文)* 封装POST请求消息的请求参数的

		* 字符串格式:
			POST /login.html	HTTP/1.1
			Host: localhost
			User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
			Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
			Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
			Accept-Encoding: gzip, deflate
			Referer: http://localhost/login.html
			Connection: keep-alive
			Upgrade-Insecure-Requests: 1
			
			username=zhangsan	

响应头

1. 请求消息:客户端发送给服务器端的数据
		* 数据格式:
			1. 请求行
			2. 请求头
			3. 请求空行
			4. 请求体
	2. 响应消息:服务器端发送给客户端的数据
		* 数据格式:
			1. 响应行
				1. 组成:协议/版本 响应状态码 状态码描述
				2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
					1. 状态码都是3位数字 
					2. 分类:
						1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
						2. 2xx:成功。代表:200
						3. 3xx:重定向。代表:302(重定向)304(访问缓存)
						4. 4xx:客户端错误。
							* 代表:
								* 404(请求路径没有对应的资源) 
								* 405:请求方式没有对应的doXxx方法
						5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
							
					
			2. 响应头:
				1. 格式:头名称: 值
				2. 常见的响应头:
					1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
					2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
						* 值:
							* in-line:默认值,在当前页面内打开
							* attachment;filename=xxx:以附件形式打开响应体。文件下载
			3. 响应空行
			4. 响应体:传输的数据


		* 响应字符串格式
			HTTP/1.1 200 OK
			Content-Type: text/html;charset=UTF-8
			Content-Length: 101
			Date: Wed, 06 Jun 2018 07:08:42 GMT
	
			<html>
			  <head>
			    <title>$Title$</title>
			  </head>
			  <body>
			  hello , response
			  </body>
			</html>

servlet之request

doGet函数,browse访问的之后调用

package cn.itcast.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 演示Request对象获取请求行数据
 */

@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
            1. 获取请求方式 :GET
                * String getMethod()
            2. (*)获取虚拟目录:/day14
                * String getContextPath()
            3. 获取Servlet路径: /requestDemo1
                * String getServletPath()
            4. 获取get方式请求参数:name=zhangsan
                * String getQueryString()
            5. (*)获取请求URI:/day14/demo1
                * String getRequestURI():		/day14/requestDemo1
                * StringBuffer getRequestURL()  :http://localhost/day14/requestDemo1
            6. 获取协议及版本:HTTP/1.1
                * String getProtocol()

            7. 获取客户机的IP地址:
                * String getRemoteAddr()

         */
        //1. 获取请求方式 :GET
        String method = request.getMethod();
       
        //2.(*)获取虚拟目录:/day14
        String contextPath = request.getContextPath();
      
        //3. 获取Servlet路径: /demo1
        String servletPath = request.getServletPath();
  
        //4. 获取get方式请求参数:name=zhangsan
        String queryString = request.getQueryString();
       
        //5.(*)获取请求URI:/day14/demo1
        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
  
        //6. 获取协议及版本:HTTP/1.1
        String protocol = request.getProtocol();
 
        //7. 获取客户机的IP地址:
        String remoteAddr = request.getRemoteAddr();





 		//1.获取所有请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //根据名称获取请求头的值
            String value = request.getHeader(name);
            System.out.println(name+"---"+value);


        //演示获取请求头数据:user-agent
        String agent = request.getHeader("user-agent");

        //存储数据到request域中,其他servlet中也可以访问setAttribute设置的值
        request.setAttribute("msg","hello");


       //获取setAttribute的值,其他servlet中也可以访问
		Object msg = request.getAttribute("msg");

   
		 //获取ServletContext的值,其他servlet中也可以访问
        ServletContext servletContext = request.getServletContext();

        //跳转到requestdemo9中
        request.getRequestDispatcher("/requestDemo9").forward(request,response);
        }

    }
}

doPost函数,browse提交数据的之后调用
html提交注册信息后跳转到requestDemo7

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
</head>
<body>

    <form action="/day14/requestDemo7" method="post">
        <input type="text" placeholder="请输入用户名" name="username"><br>
        <input type="text" placeholder="请输入密码" name="password"><br>
        <input type="submit" value="注册">

    </form>

</body>
</html>

@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置流的编码
        request.setCharacterEncoding("utf-8");
        //获取请求参数username
        String username = request.getParameter("username");
        System.out.println(username);


        //1.获取字符流
        BufferedReader br = request.getReader();
        //2.读取数据
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.doPost(request,response);
    }
}

servlet之response

@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        //访问/responseDemo1,会自动跳转到/responseDemo2资源
       //1. 设置状态码为302
        response.setStatus(302);
        //2.设置响应头location
        response.setHeader("location","/day15/responseDemo2");
        
        //动态获取虚拟目录
        String contextPath = request.getContextPath();
        //简单的重定向方法
        response.sendRedirect(contextPath+"/responseDemo2");
        //response.sendRedirect("http://www.itcast.cn");
        //request转发
         request.getRequestDispatcher("/responseDemo2").forward(request,response);

        //简单的形式,设置编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取字符输出流
        PrintWriter pw = response.getWriter();
        //2.在网页上输出数据
        //pw.write("<h1>hello response</h1>");
        pw.write("你好啊啊啊 response");
        
        //1.获取字节输出流
        ServletOutputStream sos = response.getOutputStream();
        //2.在网页上输出数据
        sos.write("你好".getBytes("utf-8"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

servlet之response中的servletContext

  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
    1. 获取:
      1. 通过request对象获取
        request.getServletContext();
      2. 通过HttpServlet获取
        this.getServletContext();
    2. 功能:
      1. 获取MIME类型:
        • MIME类型:在互联网通信过程中定义的一种文件数据类型

          • 格式: 大类型/小类型 text/html image/jpeg
        • 获取:String getMimeType(String file)

      2. 域对象:共享数据
        1. setAttribute(String name,Object value)
        2. getAttribute(String name)
        3. removeAttribute(String name)

@WebServlet("/servletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*

            ServletContext对象获取:
                1. 通过request对象获取
			        request.getServletContext();
                2. 通过HttpServlet获取
                    this.getServletContext();
         */
        
        //1. 通过request对象获取
        ServletContext context1 = request.getServletContext();
        //2. 通过HttpServlet获取
        ServletContext context2 = this.getServletContext();
        

    	 /*

            ServletContext功能:
               1. 获取MIME类型:

                2. 域对象:共享数据
                3. 获取文件的真实(服务器)路径
         */
        //1.获取MIME类型
        String mimeType = context.getMimeType("a.jpg");
        System.out.println(mimeType);//image/jpeg
		//2. 域对象:共享数据,在一个servlet中set,可以在另一个servlet中get
        context.setAttribute("msg","haha");
        Object msg = context.getAttribute("msg");
       // 3. 获取文件的真实(服务器)路径
        tring a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

servlet之response中的cookie

概念:客户端会话技术,将数据保存到客户端
cookie在浏览器中保存多长时间?
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
* setMaxAge(int seconds)
1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值,关闭browse时,即关闭所有网页,清除cookie
3. 零:删除cookie信息

Cookie的特点和作用
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)

cookie共享问题?
		1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
			* 默认情况下cookie不能共享

			* setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
				* 如果要共享,则可以将path设置为"/"

		2. 不同的tomcat服务器间cookie共享问题?
			* setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
				* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享	
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c = new Cookie("msg","hello");
        Cookie c1 = new Cookie("msg","setMaxAge");
        //2.发送Cookie
        response.addCookie(c);
        //3. 获取Cookie
        Cookie[] cs = request.getCookies();
        //获取数据,遍历Cookies
        if(cs != null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }
        
        //2.设置cookie的存活时间
        //c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(-1);
        //c1.setMaxAge(300);
        c1.setMaxAge(0);//删除Cookie
        //3.发送Cookie
        response.addCookie(c1);
        //设置path,让当前服务器下部署的所有项目共享Cookie信息
        c1.setPath("/");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

servlet之response中的session

概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中

@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据

        //1.获取session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("msg","hello session");
        Object msg = session.getAttribute("msg");

        Cookie c = new Cookie("JSESSIONID",session.getId());
        c.setMaxAge(60*60);
        response.addCookie(c);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

servlet之Filter


1. web.xml配置	
			<filter>
		        <filter-name>demo1</filter-name>
		        <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
		    </filter>
		    <filter-mapping>
		        <filter-name>demo1</filter-name>
				<!-- 拦截路径 -->
		        <url-pattern>/*</url-pattern>
		    </filter-mapping>
2. 过滤器执行流程
			1. 执行过滤器
			2. 执行放行后的资源
			3. 回来执行过滤器放行代码下边的代码
		3. 过滤器生命周期方法
			1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
			2. doFilter:每一次请求被拦截资源时,会执行。执行多次
			3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
		4. 过滤器配置详解
			* 拦截路径配置:
				1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
				2. 拦截目录: /user/*	访问/user下的所有资源时,过滤器都会被执行
				3. 后缀名拦截: *.jsp		访问所有后缀名为jsp资源时,过滤器都会被执行
				4. 拦截所有资源:/*		访问所有资源时,过滤器都会被执行
			* 拦截方式配置:资源被访问的方式
				* 注解配置:
					* 设置dispatcherTypes属性
						1. REQUEST:默认值。浏览器直接请求资源
						2. FORWARD:转发访问资源
						3. INCLUDE:包含访问资源
						4. ERROR:错误跳转资源
						5. ASYNC:异步访问资源
	    5. 过滤器链(配置多个过滤器)
			 * 执行顺序:如果有两个过滤器:过滤器1和过滤器2
					1. 过滤器1
					2. 过滤器2
					3. 资源执行
					4. 过滤器2
					5. 过滤器1 
@WebFilter("/*")
public class FilterDemo6 implements Filter {


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo6执行了...");

        chain.doFilter(req, resp);

        System.out.println("filterDemo6回来了...");
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {
    }

}


@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,,DispatcherType.REQUEST})
public class FilterDemo5 implements Filter {


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo5....");
        chain.doFilter(req, resp);
        System.out.println("filterDemo5....");
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {
    }

}

servlet之Listener

调用服务器tomcat时先调用ServletContextListener中的contextInitialized,关闭服务器tomcat时,先调用contextDestroyed

@WebListener
public class ContextLoaderListener implements ServletContextListener {

    /**
     * 监听ServletContext对象创建的。ServletContext对象服务器启动后自动创建。
     *
     * 在服务器启动后自动调用
     * @param servletContextEvent
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //加载资源文件
        //1.获取ServletContext对象
        ServletContext servletContext = servletContextEvent.getServletContext();

        //2.加载资源文件
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");

        //3.获取真实路径
        String realPath = servletContext.getRealPath(contextConfigLocation);

        //4.加载进内存
        try{
            FileInputStream fis = new FileInputStream(realPath);
            System.out.println(fis);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("ServletContext对象被创建了。。。");
    }

    /**
     * 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
     * @param servletContextEvent
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象被销毁了。。。");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值