Request 和Response

Response :
响应,向页面回写内容。分为:响应行 响应头 响应体
响应行:协议/版本 状态码 状态吗说明
状态码:

  • 1xx :已发送请求

  • 2xx:已完成响应---------------------200:正常响应

  • 3xx:浏览器还需要进一步操作 -----302:重定向,配合响应头location // ----304读缓存

  • 4xx:用户操作错误
    ------------------404:用户操作错误
    ----------405:访问的方式不存在(表单提交中定义的方法是get,但servlet 中定义的是doPost)

  • 5xx:服务器错误-------------内部异常
    常用方法:

  • setStatus(int 状态码):针对于1 2 3

  • (了解)sendError(int 状态码):针对于4和5

响应头:key/values (value 可以是多个值)
常用方法:

  • (★★)setHeader(String key ,String value) :设置字符串形式的响应头
  • setIntHeader(String key,int value):设置整型的响应头
  • serDateheader(String key,long value):设置时间的响应头
  • (★★)addHeader(String key,String value):设置字符串形式的响应头,之前设置过就追加,没设置过就设置
  • addIntHeader(String key,int value):追加整型响应头
  • addDateHeader(String key ,long value):追加时间响应头

常用的响应头:

  • (★)location :重定向
  • refresh: 定时刷新
  • -content-type: 设置文件的mime 类型,设置响应的编码以及告诉浏览器用什么编码打开
  • content-disposition :文件下载需要的响应头

关于这些方法,在API中可以查找到,servletResponse---->HttpservletResponse 都是接口,但是在代码我们可以直接调用:
void doPost(HttpServletRequest req, HttpServletResponse resp)
resp.addHeader(“Refresh”,“3;url=http://locahost:8080/index.jsp”);
接口的方法是不能直接使用的,但是这里是服务器(tomcat )帮我们做了实现类,值是方法定义时,使用接口来接收的。相似的还有在jdbc 操作数据库时,方法也基本都是接口的,但是我们依然是直接使用,同样的也是因为mysql 做了实现类。

操作响应头的具体应用:

  1. 重定向:
//方式一:底层代码是方式一
 resp.sendRedirect("最终目的地的地址")
//方式二:
resp.setStatus(302);
resp.addHeader("location","最终目的地的地址");
  1. 定时刷新
//登陆错误时返回登陆页面
 resp.addHeader(“Refresh”,“3;url=http://localhost:8080/index.jsp”);
//刷新倒计时。完全使用前端代码,完成刷新和页面的跳转
 <!--http-equiv :相当于响应头
        content:  响应头内容
     -->
    <meta charset="UTF-8" http-equiv="refresh" content="3;url=http://localhost:8080/refresh2.html ">

响应体:页面上显示的内容
常用方法:

  • PrintWriter getWriter() :返回字符流

  • servletOutputStream  getOutputStream(): 字节流
    使用总结:自己写的东西使用字符流,其他的都是用字节流

  • (★)setContentType(" ") : 这个在处理乱码问题的时候会用到。它的底层其实就是:设置content-type 响应头,也可以设置文件的mime 类型

resp.setHeader("content","text/html:charset=utf-8");

Content-type 响应头的作用:设置文件的mime 类型,告诉浏览器用什么编码集打开返回的信息

  • 注意: 在使用的时候两个流是互斥的,而且在响应完成之后,服务器会帮我们判断流是否关闭,没有关闭他也会帮我们关闭。

案例: 文件下载。就是将服务器的资源发送给客户端,前提是客户端有这样的请求
下载方式:

1.超链接下载:直接在页面上提供一个超链接,添加a 标签。路径是你要下载的资源的路径

<a href="http://localhost:8080/Download/day10.txt">超链接下载day10.doc</a><br>
<a href="http://localhost:8080/Download/1.jpg">超链接下载1.jpg图片</a>

//图片和记事本文件会在页面上直接打开,doc 或其他大的文件会下载

如果浏览器能解析这个文件的mime 类型,那就直接打开,如果不能解析mime 类型那就只能下载

//原理:
resp.setContentType("txt/html"); // 设置文件的mime 类型
resp.getWriter().print("hello word!")
//此时浏览器运行,就会提醒你下载这个文件,因为他无法解析

2.编码下载,通过servlet 完成
还是要设置a标签《a href=“http://localhost:8080/Download?name=day10.txt”》 下载 day10.txt

  • 设置文件的mime 类型

  • 设置下载头信息

  • 提供流
    设置两个头(content-type content-disposition)两个流(输入输出流)
    《a href=“http://localhost:8080/download?name=day10.txt”>编码下载访问的是映射为download 的servlet
    代码:

package c_Download;
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        //获取文件名
        String filename=req.getParameter("name");
        
        //获取文件的mime 类型
        ServletContext context = getServletContext();
        String mimeType=context.getMimeType(filename);
        
        //1.设置mime 类型
        resp.setContentType(mimeType);
        
        //2.设置下载头
        resp.setHeader("content-disposition","attachment;filename="+filename);
        
        //对拷流
        //获取输入流
        InputStream is = context.getResourceAsStream("/Download/"+filename);
        //获取输出流
        ServletOutputStream os = resp.getOutputStream();
        //对拷,从底层操作字节流
        /*int len= -1;
        byte[] b= new byte[1024];
        while((len=is.read(b))!=-1){
            os.write(b,0,len);
        }*/

       // 使用jar 包操作对拷流

        IOUtils.copy(is,os);
        os.close();
        is.close();
    }
}

扩展:关于验证码(通过respon 生成验证码)
验证码的作用:防止暴力攻击
暴力攻击:生成一段代码,不断的向服务器发送请求,就能攻击到服务器(/如果是账号和密码登录,只要你有账号,只要随机对的生成大量的密码你就能登录)。验证码的作用就是区分,你到底是个人还是机器。一般情况机器做不到填写验证码(验证代码网上有很多,自己写就有一点困难)




Request: 请求
作用:获取浏览器发送过来的数据。分为三部分:请求行,请求体,请求行
操作请求行:
格式:请求方式 请求资源 协议/版本
常用方法: 都接口HttpServletRequest 中
掌握:

  • (★)获取请求方式:String getMethod()
  • (★)获取请求者的IP地址: String getRemoteAddr()
  • (★★)在Java代码中获取项目路径 :String getContextPath()

了解:

  • String getRequestURI(); 获取从项目名到参数之前的内容
  • StringBuffer getRequestURL(): 获取的是带协议的完整路径: 例如:http://localhost:8080/1.html
  • String getQueryString(): 获取get 请求的所有参数,存储到一个字符串中。例如:username=tom&password=123
  • String getProtocol():获取协议版本

操作请求头:
格式:key/values
常用的方法:

  • (★) String getHeader(String key); 通过key 获取value (一个)
    了解

  • Enumeration getHeaders() : 通过key 获取指定的value(多个)

  • Enumeration getHeaderNames(); 获取所有的请求头的名称

  • int getIntHeader(String key); 获取整型的请求头

  • long getDateHeader(String key); 获取时间的请求头

重要的请求头:

  • user-agent:浏览器内核
  • referer :页面从哪里来,防盗链

(★★★)操作请求参数: (其实就是向服务器提交的数据)
例如:在使用get 请求的时候在地址栏就能看见请求参数:username=tom&password=123&bobby=sleep(在post 请求中在请求体中就能看见请求参数)
常用方法:

  • (★)String getParameter(String key ): 获取一个值
  • (★) String[] getParameterValues(String key ): 获取这个key 对应的多个值
  • (★)Map< String,String[] > getParameterMap():获取请求时所有的参数

(★★★)重要问题:
当我们在表单中写中文数据时,会出现乱码。乱码出现的原因:

  • 对于get : 参数追加到地址栏时,会使用utf-8 编码,服务器(tomcat )接收到请求之后会使用iso-8859-1 解码数据。就出现了乱码。

  • 对于post :参数是在请求体中,服务器获取iso-8859-1 解码,也会产生乱码。
    解决办法:

  • 通用方法:在服务器中的数据已经是经过解析的,所以将他反解析回去就行了:
    new String (参数.getBytes(“iso-8859-1”),“utf-8”);//先用iso-8859-1 编码,在使用utf-8 编码成字符串。

  • 针对于post 的方法:request.setCharacterEncoding(“utf-8”);
    **应用:**对于文件下载时,出现的文件名的问题。第一点: 在获取文件名称的时候要注意解决乱码问题。第二个问题:常见的浏览器对文件名进行utf-8 的编码解码,火狐浏览器按照base64 编码解码,所以在设置文件下载名称时,要对文件名作相应的操作:

 //使用谷歌浏览器,将文件名设置为utf-8 的编码
  //resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));

使用工具类:通过传入文件的agent req.getHeaher(“user-agent”) 文件名。根据agent 判断浏览器,再改变文件名。

resp.setHeader("content-disposition","attachement;filename="+ filename_utils.getName(req.getHeader("user-agent"),filename));


域对象:Request

  • 方法:xxxAtribute()。 相当于map 使用
  • 生命周期:一次请求,响应生成之前
  • 请求转移:servlet 1 接收到请求,无法解决,servlet 1 跳转到servlet2 。servlet 2 解决这个请求,并且返回给请求者。
request.getRequestDisatcher("内部路径".forwar(request,response))

案例:用户注册
表单提交页面信息,提交到服务器,然后保存到数据库中。
要使用到selvlet ,(网页访问) JDBC Java 操作数据库,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值