JSP 中request与response的用法详解

JSP 中request与response的用法详解

概要:

在学习这两个对象之前,我们应该已经有了http协议的基本了解了,如果不清楚http协议的可以看我的关于http协议的介绍。因为其实request和response的使用大部分都是对http协议的操作。

request对象的介绍

我们先从request对象进行介绍:

我们知道http协议定义了请求服务器的格式:

请求行
请求头
空格
请求体(get请求没有请求体)

好了,这里我们就不详细介绍了,我们只看几个应用就可以了,没什么难度:

应用1 获取请求头

/**
 * 获取HTTP请求头
 *   String getHeader(String name),适用于单值头
 *   int getIntHeader(String name),适用于单值int类型的请求头
 *   long getDateHeader(String name),适用于单值毫秒类型的请求头
 *    Enumeration<String> getHeaders(String name),适用于多值请求头
 *
 *
 */
public class CServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException { 

    String ip = request.getRemoteAddr();//获取IP地址
    String method = request.getMethod();//获取请求方式
    System.out.println(ip);
    System.out.println(method);
    getLiuLanQi(request);
    protectMethod(request, response);
  }
//防盗链
  public void protectMethod(HttpServletRequest request,
      HttpServletResponse response) {
    String url = request.getHeader("referer");
    System.out.println(url);
    if(url != null && url.equalsIgnoreCase("http://localhost:8080/day10/MyHtml.html") ) {
      System.out.println("hi");
    }
    else {
      response.setStatus(302);
      response.setHeader("Location","/day10/MyHtml.html");
      System.out.println("重定向");
    }
  }
//判断浏览器的类型
  public void getLiuLanQi(HttpServletRequest request) {
    String user = request.getHeader("User-Agent");
    if(user != null) {
      String userNoC = user.toLowerCase();
      if(userNoC.contains("chrome")) {
        System.out.println("浏览器类型:谷歌" );
      }
      else if(userNoC.contains("firefox/")) {
        System.out.println("浏览器类型:火狐");
      }
      else {
        System.out.println("浏览器类型:IE");
      }
    }
    else {
      System.out.println("null");
    }
  }
}

应用2获取URL路径

/**
 * 获取请求URL
  http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
    > String getScheme():获取协议,http
    > String getServerName():获取服务器名,localhost
    > String getServerPort():获取服务器端口,8080
    > *****String getContextPath():获取项目名,/day10_2
    > String getServletPath():获取Servlet路径,/AServlet
    > String getQueryString():获取参数部分,即问号后面的部分。username=xxx&password=yyy
    > String getRequestURI():获取请求URI,等于项目名+Servlet路径。/day10_2/AServlet
    > String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/day10_2/AServlet
 *
 *
 */
public class DServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    System.out.println(request.getScheme());
    System.out.println(request.getServerName());
    System.out.println(request.getServerPort());
    System.out.println(request.getContextPath());
    System.out.println(request.getServletPath());
    System.out.println(request.getQueryString());
    System.out.println(request.getRequestURI());
    System.out.println(request.getRequestURL());
  } 

}

应用3获取请求参数

/**
 *
 * 请求参数:有一个参数一个值的,还有一个参数多个值!
    > *****String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
    > String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数
    > Enumeration<String> getParameterNames():获取所有请求参数名称
    > *****Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值。
 *
 */
public class EServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request,response);
  } 

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");//调用他来解决乱码问题的,不会的可以看我写的解决乱码的那一篇
    String name = request.getParameter("name");
    String password = request.getParameter("password");
    String[] aihao = request.getParameterValues("aihao");
    response.setHeader("content-type", "text/html;charset=utf-8");
    PrintWriter pw = response.getWriter();
    pw.println("name:" + name + "<br/>");
    pw.println("password:" + password + "<br/>");
    pw.print("aihao");
    for (int i = 0; i < aihao.length; i++) {
      switch (i) {
      case 1:
        pw.print("吃饭");
        break;
      case 2:
        pw.print("睡觉");
        break;
      case 3:
        pw.print("打豆豆");
        break; 

      default: 

        break;
      }
    }
    pw.close();
  } 

}
<!-- 用于发送请求的html -->
<html>
 <head>
  <title>denglu.html</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 </head> 

 <body>
  <form action="/day10/EServlet" method="post"><!-- 通过post方法提交 -->
    姓名:<input type="text" name="name"/><br/>
    密码:<input type="password" name="password"><br/>
    爱好:<input type="checkbox" name="aihao" value="1"/>吃饭
    <input type="checkbox" name="aihao" value="2"/>睡觉
    <input type="checkbox" name="aihao" value="3"/>打豆豆
    <input type="submit" value="提交">
  </form>
 </body>
</html>

应用4设置request对象属性

用来实现同一个应用程序servlet之间值得传递,我们还用到了转发

/**
 *
 ** request域
    Servlet中三大域对象:request、session、application,都有如下三个方法:
    > void setAttribute(String name, Object value)
    > Object getAttribute(String name)
   > void removeAttribute(String name);
    > 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。 

 *
 */
public class FServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    request.setAttribute("name","weijinhao");
    request.setAttribute("password", "123");
    RequestDispatcher rd = request.getRequestDispatcher("/GServlet");
    rd.forward(request, response);
  } 

}
public class GServlet extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String name = (String)request.getAttribute("name");
    String password = (String)request.getAttribute("password");
    response.setHeader("content-type", "text/html;charset=utf-8");
    PrintWriter pw = response.getWriter();
    pw.println("name:" + name + "<br/>");
    pw.println("password:" + password + "<br/>");
    pw.close();
  } 

}

好了,request的用法大致就是这摸多了。

让我们来看看response对象吧。

response对象的使用

http协议定义了响应浏览器的格式

响应行
响应头
空格
响应体

response对象的大致应用是用在设置响应码,设置响应头,及设置响应正文。

应用1设置响应正文

/**
   * response的正文
   * 1,字符流
   * 2,字节流
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    //String n = "hello javaweb";
    //byte[] b = n.getBytes();
    //字节流的使用
    /*ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(b);
    outputStream.close();*/ 

    //字符流的使用
    /*PrintWriter p = response.getWriter();
    p.write(n);
    p.close();*/ 

    //commoms工具包的使用
    FileInputStream fileInputStream = new FileInputStream("C:/Users/74087/Desktop/6226354_994604.jpg");
    byte[] b = IOUtils.toByteArray(fileInputStream);
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(b);
    outputStream.close();
  } 

}

应用2 设置响应码和响应头

/**
   *response 的响应码
   *1, sendError(int sc)//发送错误代码
   *2, sendError(int sc, java.lang.String msg) //发送错误代码及描述
   *3, setStatus(int sc) //发送成功响应代码
   *response 的响应头
   *1, setDateHeader(java.lang.String name, long date)
   *2, setHeader(java.lang.String name, java.lang.String value)
   *3, setIntHeader(java.lang.String name, int value)
   *  下面的和上面的作用一样但是是为了进行多值的添加
   *  addDateHeader(java.lang.String name, long date)
   *  addHeader(java.lang.String name, java.lang.String value)
   *  addIntHeader(java.lang.String name, int value)
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    //sendNum(response);
    //sendRe(response);
    //refresh(response);
    //noCache(response);
  }
  //禁用浏览器缓存
  public void noCache(HttpServletResponse response) {
    response.setHeader("Cache-Control","no-cache");
    response.setHeader("pragma","0");
    response.setHeader("expires","no-cache");
  }
  //自动跳转
  public void refresh(HttpServletResponse response) {
    response.setHeader("refresh", "5;url=http://www.baidu.com");
  }
  //重定向的使用
  public void sendRe(HttpServletResponse response) {
    response.setStatus(302);
    response.setHeader("Location", "http://www.baidu.com");
  } 

  public void sendNum(HttpServletResponse response) throws IOException {
    response.setStatus(200);
    response.sendError(404);
    response.sendError( 404, "ser accept your request but i don't want to you see my web page");
  } 

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • AngularJS的ng Http Request与response格式转换方法

    本文实例讲述了AngularJS的ng Http Request与response格式转换方法.分享给大家供大家参考,具体如下: angular作为Single Page Application推荐的交互方式当然是基于json的ajax调用.但今天要说的是当你不幸工作在一个遗留或者不可控制的服务上,而这服务是基于非json提交方式(或许是常规表单(form)提交,或者其他自定义数据格式),那么我们只能改变ng内部$http默认request/response格式转化方式. 所幸的是ng $htt

  • http调用webservice操作httprequest、httpresponse示例

    REST WCF 使得我们调用Web服务时,可以通过HttpRequest的交互简单完成.那么老版的WebService能否做到呢?WebService中通过HttpContext.Current.Rquest/Response,我们一样也可以改造WebMethod. 客户端: 复制代码 代码如下: // 创建一个DataTable DataTable data = new DataTable("Project"); data.Columns.Add("Name")

  • JSP中Servlet的Request与Response的用法与区别

    JSP中Servlet的Request与Response的用法与区别 简介:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了. 一,Request Request代表请求对象,其中封装了对请求中具有请求行.请求头.实体内容的操作的方法

  • @ResponseBody 和 @RequestBody 注解的区别

    @ResponseBody 和 @RequestBody 注解的区别 1 前言 在详述 @ResponseBody 和 @RequestBody 注解之前,咱先了解一下 @RequestMapping 注解,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径:用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法.例如. /** * 用于类上,可以没有 */ @RequestMapping

  • C#中Request.Cookies 和 Response.Cookies 的区别分析

    .NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Cookie:Response.Cookies 在服务器上创建并以 Set-Cookie 标头的形式传输到客户端.也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的. 第一次创建Cookies的时候,下面的2种读取方法读取到的内容是一样: C# 代码 复制代码 代码如下: HttpCookie hc = new HttpCookie("Use

  • jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML

    摘要:本节补充ajax学习笔记1中 第二种方式:使用XMLHttpRequest对象的responseXML的方式来接受XML数据对象的DOM对象 在ajax学习笔记1中已经对准备工作和需要用到的知识做了比较详细的介绍,本节主要介绍需要修改的代码以及新增的代码 .新增一个servlet类 AJAXXMLServer.java 复制代码 代码如下: import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServle

  • Asp.net response对象与request对象使用介绍

    1.Response:服务器发给客户端信息,或者说是服务器的向用户发送输出结果. Redirect:让客户端重新定向到指定的 URL. Write:写出指定字符串. 2.request:客户端发给服务器,或者说是从客户端取得信息. form:从使用post提交方式的表单获取表单元素的值. querystring:取回查询字符串中的变量值,适用于get提交方式的表单. 举一个列子:一个登陆页面,还有一个主页面.当登陆页面登陆成功后,就自动跳转到主页面. 1.login.aspx 复制代码 代码如下

  • ASP.NET笔记之 Request 、Response 与Server的使用

    1.Request 下面做一个实例,通过Request的一些方法来判断浏览图片是不是在内部浏览,还是直接按网址浏览或者被外部使用 复制代码 代码如下: <%@ WebHandler Language="C#" Class="image_Test" %> using System; using System.Web; public class image_Test : IHttpHandler { public void ProcessRequest(Ht

  • JSP内置对象:Request和Response的简单介绍及使用

    JSP内置对象之request对象客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应.它是HttpServletRequest类的实例.序号 方 法 说 明 1 object getAttribute(String name) 返回指定属性的属性值 2 Enumeration getAttributeNames() 返回所有可用属性名的枚举 3 String getCharacterEncoding() 返回字符编码方式 4 int getContentLen

  • JSP 中request与response的用法详解

    JSP 中request与response的用法详解 概要: 在学习这两个对象之前,我们应该已经有了http协议的基本了解了,如果不清楚http协议的可以看我的关于http协议的介绍.因为其实request和response的使用大部分都是对http协议的操作. request对象的介绍 我们先从request对象进行介绍: 我们知道http协议定义了请求服务器的格式: 请求行 请求头 空格 请求体(get请求没有请求体) 好了,这里我们就不详细介绍了,我们只看几个应用就可以了,没什么难度: 应

  • jsp response.sendRedirect()用法详解

    sendRedirect() response和request一样都是jsp内置对象,request是获取用户的请求,response处理用户请求.sendRedirect()函数的作用是重定向网页,向浏览器发送一个特殊的Header,然后由浏览器来做重定向,转到指定的页面.下面我将创建四个页面,首先是sex.jsp,有一个下拉列表和提交按钮确定,选择"男",就跳转到male.jsp,选择"女"就跳转到female.jsp,中间通过sex_action.jsp进行重

  • jsp中过滤器选择过滤器的写法详解

    实例如下: public class LoginCheckFilter implements Filter { private FilterConfig config=null; private String webroot=null; public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse res

  • Django中的FBV和CBV用法详解

    FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): """返回注册页面""" return render(request, "register.html") def register_handle(request): """进行注册处理""

  • IOS开发中NSURL的基本操作及用法详解

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以封装一个NSURL,操作很方便. 1.URL URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL可能包含远程服务器上的资源的位置,本地磁盘上的文件的路径,甚

  • JavaScript中SetInterval与setTimeout的用法详解

    setTimeout 描述 setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 注:调用过程中,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串. millisec 必需,在执行代码前需等待的毫秒数. setTimeinterval setInterval(code,millisec[,"lang"]) 参数

  • C++中auto_ptr智能指针的用法详解

    智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有

  • Linux中 sed 和 awk的用法详解

    sed用法: sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为: sed [-nefri] 'command' 输入文本 常用选项: -n∶使用安静(silent)模式.在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上.但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来. -e∶直接在指令列模式上进行 sed 的

  • Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l', 'l', 'e', 'n') >>> t.index('a') Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> t.index('a') V

  • jquery 中toggle的2种用法详解(推荐)

    一.在元素的click事件中绑定两个或两个以上的函数  toggle不像bind需要在后面添加"click"来绑定click触发事件,toggle本身就是click触发的(而且只能click触发), 如下实例: <input id="btntest" type="button" value="点一下我" /> <div>我是动态显示的</div> <script type="

随机推荐