Servlet&Request&Response


一、Servlet

Servlet: server applet

概念:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
将来我们自定义一个类,实现Servlet接口,复写方法。

快速入门

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
    * public class ServletDemo1 implements Servlet
  3. 实现接口中的抽象方法
  4. 配置Servlet
    在web.xml中配置:
<!--配置Servlet -->
		    <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>

执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的标签体内容。
  3. 如果有,则在找到对应的全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

Servlet中的生命周期方法

  1. 被创建:执行init方法,只执行一次
    * Servlet什么时候被创建?
    * 默认情况下,第一次被访问时,Servlet被创建
    * 可以配置执行Servlet的创建时机。
    * 在< servlet>标签下配置
    1. 第一次被访问时,创建
    * < load-on-startup>的值为负数
    2. 在服务器启动时,创建
    * 的值为0或正整数
    * * Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
    * 多个用户同时访问时,可能存在线程安全问题。
    * 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
  2. 提供服务:执行service方法,执行多次
    * 每次访问Servlet时,Service方法都会被调用一次。
  3. 被销毁:执行destroy方法,只执行一次
    * Servlet被销毁时执行。服务器关闭时,Servlet被销毁
    * 只有服务器正常关闭时,才会执行destroy方法。
    * destroy方法在Servlet被销毁之前执行,一般用于释放资源

Servlet的体系结构

Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类

	* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
		* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
	* HttpServlet:对http协议的一种封装,简化操作
		1. 定义类继承HttpServlet
		2. 复写doGet/doPost方法

Servlet相关配置

  1. urlpartten:Servlet访问路径
    1. 一个Servlet可以定义多个访问路径 : @WebServlet({“/d4”,“/dd4”,“/ddd4”})
    2. 路径定义规则:
      1. /xxx:路径匹配
      2. /xxx/xxx:多层路径,目录结构
      3. *.do:扩展名匹配

doPost和doGet的区别

get和post是http协议的两种方法

1、安全
get调用在url里显示正传送给servlet的数据,这在系统的安全方面可能带来问题,例如用户名和密码等
post就可以在一定程度上解决此类问题
 
2、服务器接收方式
服务器随机接受get方法的数据,一旦断电等原因,服务器也不知道信息是否发送完毕
而post方法,服务器先接受数据信息的长度,然后再接受数据
 
3、form运行方式
当form框里面的method为get时,执行doGet方法
当form框里面的method为post时,执行doPost方法
 
4、容量限制
get方法后面的信息量字节大小不要超过1.3K,而Post则没有限制

二、Request

request对象和response对象的原理

  1. request和response对象是由服务器创建的。我们来使用它们
  2. request对象是来获取请求消息,response对象是来设置响应消息

request对象继承体系结构

	ServletRequest		--	接口
		|	继承
	HttpServletRequest	-- 接口
		|	实现
	org.apache.catalina.connector.RequestFacade 类(tomcat)

request功能

1. 获取请求消息数据

  1. 获取请求行数据
    * GET /day14/demo1?name=zhangsan HTTP/1.1
    * 方法:
    1. 获取请求方式 :GET
    * String getMethod()
    2. ()获取虚拟目录:/day14
    * String getContextPath()
    3. 获取Servlet路径: /demo1
    * String getServletPath()
    4. 获取get方式请求参数:name=zhangsan
    * String getQueryString()
    5. (
    )获取请求URI:/day14/demo1
    * String getRequestURI(): /day14/demo1
    * StringBuffer getRequestURL() :http://localhost/day14/demo1
    * URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
    * URI:统一资源标识符 : /day14/demo1 共和国
    6. 获取协议及版本:HTTP/1.1
    * String getProtocol()
    7. 获取客户机的IP地址:
    * String getRemoteAddr()
  1. 获取请求头数据
    * 方法:
    * (*)String getHeader(String name):通过请求头的名称获取请求头的值
    * Enumeration getHeaderNames():获取所有的请求头名称
  1. 获取请求体数据:
    * 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
    * 步骤:
    1. 获取流对象
    * BufferedReader getReader():获取字符输入流,只能操作字符数据
    * ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    * 在文件上传知识点后讲解
    2. 再从流对象中拿数据

2. 其他功能

  1. 不论get还是post请求方式都可以使用下列方法来获取请求参数
    1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
    2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
    3. Enumeration getParameterNames():获取所有请求的参数名称
    4. Map<String,String[]> getParameterMap():获取所有参数的map集合
      * 中文乱码问题:
       * get方式:tomcat 8 已经将get方式乱码问题解决了
       * post方式:会乱码
    * 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
  1. 请求转发:一种在服务器内部的资源跳转方式
    1. 步骤:
        1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
         2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
    2. 特点:
        1. 浏览器地址栏路径不发生变化
        2. 只能转发到当前服务器内部资源中。
        3. 转发是一次请求
  1. 共享数据:
       * 域对象:一个有作用范围的对象,可以在范围内共享数据
       * request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        * 方法:
        1. void setAttribute(String name,Object obj):存储数据
        2. Object getAttitude(String name):通过键获取值
        3. void removeAttribute(String name):通过键移除键值对
    * 注意:这个放于forward方法的上面,不然响应太快会导致无法获取信息!
  1. 获取ServletContext:
    * ServletContext getServletContext()

三、Response

功能:设置响应消息

  1. 设置响应行
    1. 格式:HTTP/1.1 200 ok
    2. 设置状态码:setStatus(int sc)

  2. 设置响应头:setHeader(String name, String value)

  3. 设置响应体:
    * 使用步骤:
    1. 获取输出流
      * 字符输出流:PrintWriter getWriter()
      * 字节输出流:ServletOutputStream getOutputStream()
    2. 使用输出流,将数据输出到客户端浏览器

案例:

完成重定向
重定向:资源跳转的方式

                //1. 设置状态码为302
		        response.setStatus(302);
		        //2.设置响应头location
		        response.setHeader("location","/day15/responseDemo2");


		        //简单的重定向方法
		        response.sendRedirect("/day15/responseDemo2");

重定向和转发的区别

重定向的特点:redirect

			1. 地址栏发生变化
			2. 重定向可以访问其他站点(服务器)的资源
			3. 重定向是两次请求。不能使用request对象来共享数据

转发的特点:forward

			1. 转发地址栏路径不变
			2. 转发只能访问当前服务器下的资源
			3. 转发是一次请求,可以使用request对象来共享数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值