JAVA学习总结二十三

servlet请求路径的问题:

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

如果目录比较深,频繁用。。/很繁琐,而且移植性不好。可以在url路径汇总,以/开始,表示回到webapps根目录,在加上部署名,再书写Servlet请求路径
<form action="/webTest/tt">(此处tt为XML中的<url-pattern>/tt</url-pattern>)

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应用程序中的web.xml书写错误,那么解析失败,从而抛出解析异常。正确解析web.xml,可以确定部署的web组件信息。
  3. 加载并实例化Servlet。加上标签后规则如下:
    在xml中中间书写1中间为1或0时,为WEB容器启动就实例化;1中间为负数或不写,为第一次访问时实例化

  4. 调用init()方法完成初始化。

  5. 当请求到达后,调用servlet()完成任务。
  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的setHeader()可以设置响应头,但是响应头必须要被浏览器识别才有意义。所以通常会把响应头的设置封装成响应对象的方法,比如:setContentType(),addCookie()等。

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

HttpServletResponse响应对象有两个方法可以向客户端输出数据。

  • getWriter(),得到打印字符流,可以向客户端输出文本数据
  • getOutputStream(),得到输出字节流,可以向客户端输出二进制数据。

重定向工作流程:

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

错误:java.lang.illegalStateException:Cannot call sendRedirect() after the response has been
不能重复请求

GET/POST提交方法

浏览器向WEB服务器发送HTTP请求
  • 用户在网页上点击一个超连接
  • 用户提交在网页上填写好的表单
  • 用户在浏览器地址栏中输入URL地址并回车

默认情况下以上行为都是使用HTTP协议的GET方法提交请求

定制浏览器行为:<form name="login" method="post">

Get和POST方式的区别

1、流格式的区别。

get方式表单数据附加在URL后面,而POST方式表单数据在消息体中,所以GET方式没有消息体。

2、用途的区别

get方式主要用于资源的查找,而POST方式主要用于数据的传输。

3、传输性能的区别

  • get方式只能传输文本数据,而post方式可以传输文本和二进制数据;
  • get方式不能传输大数据。而POST方式可以传输大数据;
  • get方式的表单数据附加在URL后面,所以表单数据会在浏览器地址栏中显示出来,而POST方式的表单数据在消息体中,所以浏览器地址栏不会显示,相对get方式数据安全一些。
  • get方式的数据会在浏览器中缓存,而post方式不会缓存。

超链接的href、表单的action、重定向如果以/开始,必须加上部署名
如:/webTest/all

获得真实路径getRealPath,内部转发如果以/开始,应该书写相对于web应用程序的路径,不加部署名。

2016/7/6 09:12:19

获得表单数据

  1. 同样表单名的两个数据,只能得到第一个表单名对应的表单值
  2. 通过request.getparametervalues();可以得到一个表单名对应的所有的值的数组,通过遍历再得到每个数据。
  3. 要获得单选框数据,首先要设置单选框的value值和checked属性,不然无法获得value值。
  4. 获得下拉列表的数据,要设置每个option的value值,提交的是option的value值。
  5. request.getparameter()获取只有一个数据的表单名的数据,request.getparametervalues()获取具有多个数据的表单名对应的数据。(未选中的复选框的数据为空,遍历前需要判断非空)
  6. 复选框只能提交选中项的value值

    `获得复选框数据:首先要给表单和按钮(button)设置ID,然后写脚本,以JQuery为例:
    f1为表单ID,profession为列表框ID
    function formSubmit(){

    //选中列表框中的所有元素
    $("#prefession option").attr("selected",true);
    $("#f1").submit();
    //每次点击按钮即可不会提交空值
    

    }`

制作上传图片并预览效果
  1. 表单是做文件上传时,method必须为post,enctype=”multipart/form-data”(作用是将二进制数据提交给服务器,但是格式不再是POST请求格式)
  2. 在js文件中考入file.js文件,并导入到脚本。
  3. 在body中的表单中建立<div id="headDiv>作为预览框,里面设置<img src="" id="headImg">

  4. 后面写 头像:<input type="file" name="head" onchange="previewImage(this,'headDiv','headImg')"><br>

  5. <input type="submit" value="提交">

  6. 注意:WebContent文件夹里创建face文件夹专门用来存放头像图片
  7. 注意:在servlet中类的声明之前写上@multipartConfig
  8. 上传文件代码如下:
    doPost中的代码:
    request.setCharacterENcoding(“utf-8”);
    response.setContentType(“text/html;charset=utf-8”);
    PrintWriter out = response.getWriter();

    String userNameString = request.getParameter(“userName”);
    //得到head文件表单对应的Part对象
    Part part = request。getPart(“head”);

    String fileName = part.getHeader(“content-disposition”);
    //以时间毫秒数作为文件名,后缀名不变
    fileName = System.currentTimeMillis()+fileName.substring(fileName.lastIndexOf(“.“),fileName.lastIndexOf(“\”));
    //得到文件的真实路径
    String filePath = this.getServletContext().getRealPath(“/face/”+fileName);
    //将part对象的二进制数据写入文件
    part。write(filePath);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值