servlet

servlet请求路径的问题:

在form的action属性中,直接写Servlet的url路径。默认是在当前目录下查找,一旦网页在子目录中,那么会在提交路径中加上子目录的名称。可以通过../回到上一级目录。

如果目录比较深,频繁用../很繁琐,而且移植性不好。可以在url路径中,以/开始,表示回到webapps根目录,再加上布署名。再书写servlet请求路径<form action="/webTest/tt">

servlet的url路径书写的方式:

  1. 精确映射—— /abc(表示只能以abc路径查找servlet)
  2. 扩展映射 —— *.action (表示凡是以.action结尾的请求都能访问servlet)
  3. 路径映射 —— /abc/*(表示凡是在/abc/路径下的请求都能访问servlet)

Servlet生命周期(面)

  1. 启动tomcat,读取conf/server.xml文件,以确定启动端口和web应用程序的部署目录
  2. 读取布属目录中所有的web应用程序的web.xml并解析。所以,一旦有一个web应用程序中的web.xml书写错误,那么解析失败,从而抛出解析异常。正确解析web.xml可以确定布属的web组件信息。
  3. 加载并实例化Servlet。加上<load-on-startup>标签。如果该标签的值为0或正数,表示WEB容器已启动就实例化。如果该标签不谢或为负数,表示第一次访问再实例化。
  4. 调用init()完成初始化。
  5. 当请求到达后,调用service()完成业务。
  6. 销毁阶段,调用destory()完成清理工作。
在整个生命周期中1.2.3.4.6.都只执行一次。只有5才是每次请求都会执行。而且servlet对象只有一个,是单实例多线程类。
在注册Servlet时,可以加入
<init-param>
    <param-name>aaa</param-name>
    <param-value>111</param-value>
</init-param>
进行servlet初始化信息的描述。可以通过ServletConfig配置对象中的getInitParameter()根据参数名称,得到参数值。但该初始化参数只能在当前Servlet中使用,不能再别的Servlet使用。

设置响应状态行

状态行分为HTTP协议、状态码和状态描述三个部分
HTTP状态码:
  • 100-199:表示信息性代码,标示客户端应该采取的其他动作,请求正在进行。
  • 200-299:表示客户请求成功。
  • 300-399:表示用于已经移走的资源文件,指示新的地址。
  • 400-499:表示又客户端引发的错误。
  • 500-599:表示由服务器引发的错误。

何时设置状态码

注意:在使用PrintWriter向客户输出信息之前,设置状态码。

通过响应对象HttpServletResponse的setHeaders()可以设置响应头。但是响应头必须要被浏览器识别才有意义。所以通常会把响应头的设置封装成响应对象的方法。

比如:setContentType(),addCookie().....

由于只有Http协议才会有响应头,所以setHeader()只存在于HttpServletResponse中。

setContentType()是在设置响应头.

HttpServletRespose响应对象有两个方法可以想客户端输出数据。getWriter()得到打印字符流,可以向客户端输出文本数据。getOutputStream()得到输出字节流,可以向客户端输出二进制数据。
重定向工作流程:

客户端访问服务器。服务器调用response.sendRedirect(),产生响应时,会产生302状态码,同时产生location响应头。客户端浏览器接收到响应信息之后,发现是302状态码,那么就会读取loation响应头的内容。然后将该内容跟新浏览器地址栏,再向服务器发出第二次请求。

请求方式一共有8种,post和get最常见

GET/POST提交方法:

浏览器向Web服务器发送HTTP请求
  • 用户在网页上点击一个超链接
  • 用户在提交网页上填写好的表单
  • 用户在浏览器地址中输入URL地址并回车
默认情况下都是使用HTTP协议的GET方法提交请求
定制浏览器行为

<FORM name='loginForm' method='POST' action='/loginServlet'>

GET(资源查找)和POST(传输优势)方式的区别

  1. 流的格式区别。
    1. get方式表单数据附加在URL后面,而POST方式表单数据在消息体中,所以GET方式没有消息体。
  2. 用途的区别:
    1. get方式主要用于资源的查找,而post方式主要用于数据的传输。
  3. 传输性能的区别
    1. get方式只能传输文本数据,而post能传输文本二进制数据。
    2. get方式不能传输大数据。而post方式可以传输大数据。
    3. get方式的变淡数据附加在URL后面,所以表单数据会在浏览器地址栏中显示出来,而post方式的表单数据在消息体中,所以浏览器地址栏不会显示。所以post相对get方式数据安全些。
    4. get方式的数据会在浏览器中缓存,而post不会缓存。
超链接href,表单的action、重定向,如果以/开始,必须加上布署名/webTest/all。
获得真实路径getRealPath,内部转发,如果以/开始,应该书写相对于web应用程序的路径,不加布署名。
request.getParameter("id");如果里面参数一样,该方法只能回去第一个得到的值。
//返回字符串数据。得到一个表单对应的所有的值
String[] setArray = reques.getParameterValues("userName");
for(String a :serArray){
    out.print(a+"<br>")
}

请求转发:在服务器内部作资源调配,客户端只发一次请求。

request请求对象中也提供了setAttribute和getAttribute方法,不过在请求对象中封装的对象,作用范围只在一次请求范围内。

在servlet中转发页面一共有两种方式:重定向和内部转发。

//在请求对象中绑定对象,作用范围在一次请求
request.setAttribute("aaa", "111");

//内部转发  
RequestDispatcher dis = request.getRequestDispatcher("/forward");
dis.forward(request, response);

//重定向发出两次请求,不能共享request中封装的数据
response.sendRedirect("/ke0706/forward");
他们区别在于
  1. 重定向由response发出,而内部转发由RequestDispatcher发出。
  2. 重定向客户端发出两次请求,而内部转发客户端只发出一次请求。所以,内部转发可以共享request请求对象中封装的数据,而重定向不行。
  3. 内部转发只能转发服务器内部的资源,但是重定向可以在第二次请求时,转向别的服务器。(重定向可以跨服务器转发,内部服务器只能在自身服务器内部)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值