Servlet详细讲解

目录

Servlet简介

Servlet的生命周期

获取请求行

获取请求头

获取请求数据

设置响应头

设置响应数据

 request请求转发

 request重定向

Cookie对象

session对象

ServletContext对象


Servlet简介

通过Servlet之第一个web项目后,我们已经知道了servlet的的大致流程,这里我进行servlet的详细讲解

Servlet是一个接口,HttpServlet实现了该接口,而我们写的MyServle是继承了HttpServlet,Servlet接口规范了服务器和浏览器的交互,使得我们只需重写service方法,不用写main方法Tomcat也能调用,这里Tomcat调用是用我们的包名加类名反射创建对象调用的,接下来我们进行讲解Servlet的其他常用方法。

Servlet的生命周期

  • 从第一次被调用到服务器关闭
  • 如果在web.xml文件中配置了<load-on-startup>1<load-on-startup>,1是执行顺序,其生命周期为从服务器启动到服务器关闭

init() servlet初始化方法,在servlet第一次被加载到内存的时候被调用,只执行一次

service() 真正处理请求的方法

destroy() servlet被销毁时被执行,也就是服务器关闭时

其实在这里不仅仅只有service方法,还有doget和dopost方法

service方法:是当你在浏览器发出请求时,不管是get请求还是post'请求,都能够执行 

doget方法:只能接受get请求

dopost方法:只能接受post请求

好了,接下来讲解浏览器发送请求数据之后,服务器是如何处理的

request对象中封装了当前请求的所有信息,request对象是由服务器创建的,并作为实参传递给处理请求的servlet的service方法虽然我们也由doget和dopost方法,这里我们以service为例,主要是讲解request对象

获取请求行

String method = req.getMethod(); //获取请求方式

String url = req.getRequestURL(); //获取请求URL

String uri = req.getRequestURI(); //获取请求URI

String h = req.getScheme(); //获取协议

获取请求头

String value = req.getHeader(""); //获取指定请求头,这里是键值对的形式,传过去一个键会获取值,如果键不存在,返回null

Enumberation e = req.getHearderNames(); //返回所有键的名字,可以结合上面的方法,获取所有的值

获取请求数据

String name = req.getParameter("uname"); //这里的键值需要你的请求数据中的键值相对应,如果不存在,返回null

String[] favs = req.getParameterValues("fav"); //这里是对同键不同值的信息获取,同样的,如果fav不存在,返回null

通过上面的学习,服务器已经能够获取浏览器的请求信息了,那如何才能将处理后的信息,返回给浏览器呢,这里服务器创建了一个response对象,做此次请求的响应,其中在response中服务器已经为我们封装好了,请求信息是谁发过来的,以及响应信息发给谁,我们只需写响应信息即可

设置响应头

resp.setHeader("",""); //设置键值对的格式,会覆盖键

resp.addHeader("",""); //添加键值对,不会覆盖键

resp.sendError(404,"sorry"); //设置状态码

resp.setHeader("content-type", "text/html; charset = utf-8"); //设置响应编码格式,告诉浏览器是html文件

resp.setContentType("text/html; charset = utf-8"); //设置响应编码格式,等价于上面

设置响应数据

resp.getWriter().write("this is response"); //数据打印到浏览器中

resp.getWriter().write("<b>this is response</b>"); //数据打印到浏览器中,设置文本为html可执行html代码

 request请求转发

req.getRequestDispatcher("page").forward(req,resp); //请求转发,实现多个servlet处理,这里是让page去处理

使用request对象实现不同的Servlet的数据流转,其作用域是一次请求内有效

String str = (String) req.getAttribute(Object value); //获取request作用域数据

req.setAttribute(Object name, Object value); // 设置request作用域数据

 request重定向

对于请求转发每次刷新都会请求一次,所以当表单数据不允许重复提交时,也就是每提交一次,数据都会变化的情况下,就不能使用请求转发了,这里引入了重定向,重定向是两次请求,两个request对象

resp.sendRedirect(""); //引号里是你重定向的URL(网络资源)或URI(本地资源) 

Cookie对象

使用了重定向,会发现浏览器发起的信息无法得到,也就是发送的不同请求的数据共享问题,为了解决此问题,引入了Cookie,存储在浏览器中,Cookie也是Session的基础,每一个浏览器中的Cookie会对应一个服务器中的session

Cookie c = new Cookie(String name, String value); //创建Cookie对象,一个Cookie对象只能存储一条信息

resp.addCookie(c); //响应Cookie信息给浏览器

c.setMaxAge(); //设置Cookie的存活时间,括号里面是秒,不设置默认是浏览器运行期间。

c.setPath(路径); //设置该Cookie对象的有效路径,不设置默认是所有路径都会带着该Cookie

Cookie[] cks = req.getCookies(); //获取Cookie信息,默认带一个JSESSIONID

cks[0].getName(); //获取Cookie的name值

cks[0].getValue(); //获取Cookie的value值

session对象

同一用户不同请求之间的数据共享问题,用户第一次访问服务器,服务器会给此用户创建一个session对象存储在服务器中,并将该session对象的JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能获取到共享数据,作用域是一次对话

HttpSession hs = req.getSession() //获取session对象

hs.setAttribute(String name, Object value) //存储数据

hs.getAttribute(String name) //获取数据,返回类型是Object

hs.getId() //获取JSESSIONID

hs.setMaxInactiveinterval(秒数) //设置session的有效时间

hs.invalidate() //设置session强制失效

ServletContext对象

该对象解决了不同用户之间的数据共享问题

三种方式获得的对象一样

ServletContext sc = this.getServletContext(); //获取ServletContext对象

ServletContext sc2 = this.getServletConfig.getServletContext(); //获取ServletContext对象

ServletContext sc = req.getSession.getServletContext(); //获取ServletContext对象

sc.setAttribute(String name,Object value);  //数据存储

sc.getAttribute(""); //获取数据,返回Object类型,如果不存在返回null

获取web.xml文件全局配置

sc.getInitParameter(String name); //根据名字返回web.xml文件中全局配置的值,返回String,如果不存在返回null

sc.getInitParameterName(); //返回键名的枚举 

获取web下的全局项目下的全局路径

String path = sc.getRealPath(String p); //p为web下的路径 

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺志营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值