request对象常用方法

时间:2019-10-04 14:48来源:编程技术
HttpServletRequest对象表示用户端的伸手,当顾客端通过HTTP合同访问服务器时,HTTP请求头中的全部音信都封装在这几个目的中,开采职员通过这些目的的议程,能够博得顾客这一个信息。

HttpServletRequest对象表示用户端的伸手,当顾客端通过HTTP合同访问服务器时,HTTP请求头中的全部音信都封装在这几个目的中,开采职员通过这些目的的议程,能够博得顾客这一个信息。

Servlet中的相关对象

web服务器调用Servlet时,会传送一些目的给Servlet:Request,Response,ServletConfig,ServletContext,Session,Cookie。学明白Servlet的API就能学了然Serlvet(学习JDBC也是学JDBC的API,只要搞懂了API就清楚了)。

  • Request
  • Response
  • ServletConfig
  • ServletContext
  • Session
  • Cookie

轻易的话,要获取浏览器音信,就找HttpServletRequest对象

1. HttpServletRequest

  • getRequestULX570L方法重回客商端发出诉求时的完全UOdysseyL。
  • getRequestU陆风X8I方法重临央求行中的能源名部分。
  • getQueryString 方法再次回到乞求行中的参数部分。
  • getPathInfo方法重返诉求U帕杰罗L中的额外路线新闻。额外路线音信是央求UMuranoL中的位于Servlet的渠道之后和查询参数此前的剧情,它以“/”最早。
  • getRemoteAddr方法重回发出供给的客户机的IP地址
  • getRemoteHost方法再次回到发出央求的顾客机的欧洲经济共同体主机名
  • getRemotePort方法再次回到想客机所使用的网络端口号
  • getLocalAddr方法再次回到WEB服务器的IP地址。
  • getLocalName方法再次来到WEB服务器的主机名

HttpServletRequest相关办法

  1. 获取须求行:
getMethod()
getRequestURI()
getRequestURL()
  • UHighlanderI:标记财富(任意能源)U奥迪Q3I-->UXC90L
  • U奥迪Q3L:标识互连网络的财富
  1. 获取诉求头:
getDateHeader();
getHeader();
getHeaderNames();
getHeaders();
  1. 取得需要内容,央浼数据:
getParameter()
getParameterMap();
getparameterNames();
getParameterValues();
getInputStream()文件上传时使用。

request得到须求头

//获取头的相关方法
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{

          String headValue = request.getHeader("Accept-Encoding");

          Enumeration e = request.getHeaders("Accept-Encoding");
          while(e.hasMoreElement()){
               String value = (String) e.nextElement();
          }

          e = request.getHeadersNames();
          while(e.hasMoreElement()){
               String name = (String) e.nextElement();
               String value = request.getHeader(name);
          }

}

request获得央浼数据

//获取请求数据
//获取数据时一般都先检查,再使用
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          //1.获取parameter的value值
          String value=request.getParameter();

          //2.获取所有parameter,返回的时枚举类型
          Enumeration e = request.getParameters();//username password
          while(e.hasMoreElement()){
               String name = (String) e.nextElement();
               String value = request.getParameter(name);
          }

          //3.获取相同parameter值的所有value值
          String[] values = request.getParameterValues("username");
          for(String v:values){
              sysout(v);
          }

          //4.获取request中的对象(框架时使用)
          Map<String,String[]>map = request.getParameterMap();
          User user = new User();
          try{
              BeanUtils.populate(user,map); //将请求参数中的map值,映射成bean
          }catch(Exception e1){e1.printStackTrace();}
          sysout(user);

          //5.通过InputStream获取数据,跟上传文件的方式一样
}

通过表单搜罗顾客机数据

  • text, password, radio, checkbox,
  • file, select, textarea, hidden
  • image, button给js编程用

request乱码难题

  1. 伸手参数的普通话乱码难点(POST提交)
  • 浏览器post提交伏乞的编码:(UTF-8)
  • ->request对象传递是码值:(UTF-8对应的码值)
  • servlet中getParameter接纳的编码:(暗许是爱尔兰语iso8859-1编码)
  • ->施工方案:request.setCharacterEncoding("UTF-8");//只对post提交有用,设置request码表
  1. 伸手参数的中文乱码难点(GET提交)
  • 手工管理:乱码先查iso8859-1,营造String,再去查UTF-8表
  • username=new String (username.getBytes("iso8859-1"), "UTF-8");
  1. URubiconL地址的编码
    • 超链接提交的中,跟GET提交方式一样
    • 直白改变服务器编码格局:不建议在支付中动用

测试题

public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          request.setCharacterEncoding("UTF-8");//指定request的编码方式,和浏览器的提交的保持一致
          String username=request.getParameter("username");//得到了中文字符“中国”

          //相当于得到了
          //username=new String("中国");

          response.setCharacterEncoding("gb2312");//指定了response的编码方式:“中国”以gb2312编码方式传递到response中
          response.setContentType("text/html;character=gb2312");//指定了浏览器页面的编码方式:浏览器以gb2312编码方式读取“中国”,不会乱码
          response.getWriter().write(username);
      }
}
  • getHeader方法
  • getHeaders方法
  • getHeaderNames方法

request完结恳求转载和mvc设计格局

request对象完毕央浼转载:央求转载指一个web资源吸取顾客端乞请后,通告服务器去调用另八个web能源扩充拍卖。

恳求转载的应用场景:MVC设计方式

  • M:model(javabean):封装数据
  • V:view(jsp):突显数据
  • C:controller(servlet):管理央浼
    • servlet作为调控器收到央求,发生多少-->面向对象的思虑-->使用javabean(model)来封装数据
    • servlet不切合做输出-->把javabean存在request域中-->交给jsp-->jsp抽出javabean做输出
  • -->MVC设计格局
  • request对象提供了一个getRequestDispatcher方法,该办法重返二个RequestDispatcher对象,调用那一个目的的forward方法可以完成央浼转载。

request.getRequestDispatcher("/index.jsp").forward(request,response);

request对象同有的时候间也是域对象(容器的效应范围),开垦人士通过request对象在伸手转载时,把数据经过request对象带给另外web能源管理。

  • setAttribute方法
  • getAttribute方法
  • removeAttribute方法
  • getAttributeNames方法

伏乞转载的细节:

  • forward方法用于将哀告转载到RequestDispatcher对象封装的能源。
  • 如果在调用forward方法此前,在servlet程序中写入的一些剧情已经被真正地传递到了顾客端,forward方法将抛出IllegalStateException十分。
  • 万一在调用forward方法此前向servlet引擎的缓冲区(response)中写入了剧情,只要写入到缓冲区中的内容还未有被真正输出到顾客端,forward方法就足以被平常实践,原本写入到输出缓冲区的内容将被清空,然而,已写入到HttpServletResponse对象中的响应头字段音信保持有效。

2. HttpServletResponse

  • getParameter方法
  • getParameterValues(String name)方法
  • getParameterNames方法
  • getParameterMap方法

HttpServletResponse相关方式

web服务器收到顾客端的http伏乞,会指向每三回呼吁,分别创制一个用来代表呼吁的request对象和象征响应的response对象。

HttpServletResponse对象服务器的响应:这一个目的中封装了向顾客端发送数据、发送响应头、发送响应状态码的艺术。

setStatus(int src)
setHeader(String name,Srting value)
getWriter()
getOutputStream()

request和response对象既然代表呼吁和响应,那么我们要取得客商机提交过来的数目,只必要找request对象就行了。要向顾客机输出多少,只须求找response对象就行了。

什么是防盗链呢?举例:本身明日有海贼王最新的财富,想要看海贼王的要在自身的网页上看。以往别的网址的人观察本人有海贼王的财富,想要把自个儿的财富粘贴在他自身的网址上。那样我分别的财富就被三个CTMuranoL+C和CT锐界L+V抢走了?而反盗链正是无法被他们CRTL+C和CRTL+V

response的outputStream字节流输出数据的难题

//在servlet中用outputStream输出中文的问题
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
           response.setHeader("content-type","text/html;charset=UTF-8");//一定要指定客户机的接受响应的编码方式
           //下面写错了,浏览器会提示下载!
           //response.setHeader("content-type","text/html,charset=UTF-8");
           String data="中国";
           OutputStream out = response.getOutputStream();
           out.write(data.getBytes("UTF-8"));//程序以UTF-8码表输出到servlet中,而没有客户机不知道以何止编码读取,所以一定要在响应头中指定客户机的接受响应的编码方式!
      }

//用html技术中meta标签模拟了一个http响应头,来控制浏览器的行为
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
           String data="中国";
           OutputStream out = response.getOutputStream();

           out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getByte());
           out.write(data.getBytes("UTF-8"));//程序以UTF-8码表输出的!
      }
}
  • 上面作者模拟一下光景。未来本身首页先有贰个超链接,指向着海贼王最新财富

response的Writer字符流输出数据的主题素材

public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          //设置response使用的码表,以控制response以什么码表向浏览器写出数据
          response.setCharacterEncoding("UTF-8");
          //指定客户机(浏览器)以什么码表打开服务器发送的数据
          response.setHeader("content-type","text/html;charset=UTF-8");

          String data="中国";
          PrintWriter out = response.getWriter();
          out.write(data);
      }
}

//小细节
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          //设置response使用的码表,以控制response以什么码表向浏览器写出数据
          response.setCharacterEncoding("UTF-8");
          //指定客户机(浏览器)以什么码表打开服务器发送的数据
          response.setContentType("text/html;charset=UTF-8");

          String data="中国";
          PrintWriter out = response.getWriter();
          out.write(data);
      }
}

澳门金莎娱乐网站 1image

response完成文件下载

//文件下载
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          //获取文件地址和文件名
          this.getServletContext().getRealPath("/download/1.jpg");
          String filename=path.substring(path.lastIndexOf("\")+1);
          //设置下载框
          response.setHeader("content-disposition","attachment;filename="+filename);
          //如果下载文件是中文名,则文件名需要经过url编码
          //response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
          InputStream in=null;
          OutputStream out=null;
          try{
               in = new FileInputStream(path);
               int len=0;
               byte buffer[]=new byte[1024];
               //把文件写入到response的字节输出流中
               out=response.getOutputStream();
               whlie((len=in.read(buffer))>0){
                   out.write(buffer,0,len); 
               }
          }finally{
              if(in!=null){
                   try{
                         in.close();
                   } catch(Exception e){
                        e.printStackTrace(); 
                    }
              } 
          }
      }
}
  • 当笔者点进去,就能够看见海贼王最新财富了

response实现供给重定向

供给重定向:三个web财富接收顾客机恳求后,文告客商机去访谈另二个web财富。

  • 极度爆发了四遍web要求,五个request/response对象,有自然的利用场景,无法滥用,服务器会过载。
  • 运用重定向本事,地址栏产生变化
//实现请求重定向
public class ResponseDemo extend HttpServlet{
     public void doGet(HttpServletRequest request, HttpServletResponse response) thows ServletException, IOException{
          /*基于对http协议的理解,才能这样写出来
          response.getStatus("302");
          response.getLocation("day06/1.jsp");
          */
          //sun公司提供了API去重定向,内部还是调用了上面的两个函数
          response.sendRedirect("day06/1.jsp");
      }
}

动用场景

  • 客户登录成功,跳转首页
  • 商品购进,跳转至购物车:转载达成的话,刷新页面就再一次购买了;重定向能一蹴而就这些标题

兑现方式

  • response.sendRedirect();
  • 落实原理正是:修改了http响应头里面包车型地铁值->302状态码和location头->完毕重定向。

澳门金莎娱乐网站 2image

response的一对细节

  • getOutputStream和getWriter方法分别用于获取二进制数据、输出文本数据的ServletOutputStream、Printwriter对象。
  • getOutputStream和getWriter那多少个方式相互排斥,调用了里面包车型地铁别样多少个措施,就不可能再调用另一个艺术。(其实字节流能够解决一切)
    • 而且调用的话就能够抛出非常
  • Servlet程序向ServletOutputStream或PrintWriter对象中写入的多寡将被Servlet引擎从response里面获取,Servlet引擎将那些多少作为响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
    • out-->response-->+响应行和响应头-->顾客机
  • Servlet的service方法甘休后,Servlet引擎将检查getWriter或getOutputStream方法再次回到的输出流对象是或不是已经调用过close方法,若无,Servlet引擎就将调用close方法关闭该输出流对象。
  • 其余的人方可经过复制粘贴作者的地点,放到它们的网页上

3. ServletConfig对象

澳门金莎娱乐网站 3image

ServletConfig

ServletConfig对象:用于封装servlet的安顿音信。

在Servlet的安顿文件中,能够使用三个或两个<init-param>标签为servlet配置部分伊始化参数。

<init-param>
       <parma-name>url</param-name>
        <param-value>jdbc:mysql://localhost::3306/test</param-value>
</init-param>

<init-param>
       <parma-name>config</param-name>
        <param-value>j/struts-config.xml</param-value>
</init-param>

当servlet配置了最先化参数后,web容器在创建servlet实例对象时,会自动将这么些起首化参数封装到ServletConfig对象传递给servlet。接着,程序员通过ServletConfig对象就能够取妥帖前servlet的发轫化参数消息。

this.getServletConfig().getParametername();
this.getServletConfig().getParameternames();
  • 那样自身就划不来啦【笔者的广告你来没看呢!】。想要看自身的财富,就必需经过本身的首页点进去看

  • 想要达成那样的作用,就要得到Referer这一个音信头看清Referer是或不是从作者的首页来的。即使不是从小编的首页来的,跳转回作者的首页

接纳场景

ServletConfig API,举个例子表明该对象的效能(最先化参数:实际付出中,有个别东西不契合在serlvet里面写死的,通过配备格局配给servlet):

  • 获得字符集编码:servlet接纳的码表
  • 获取数据库链接音信:servlet连接的数据库
  • 获得配置文件config:servlet接纳的布署文件,举例struts本人正是servlet,将配置消息放在了xml文件中。

4. ServletContext对象

 //获取到网页是从哪里来的 String referer = request.getHeader("Referer"); //如果不是从我的首页来或者从地址栏直接访问的, if ( referer == null || !referer.contains("localhost:8080/zhongfucheng/index.jsp") ) { //回到首页去 response.sendRedirect("/zhongfucheng/index.jsp"); return; } //能执行下面的语句,说明是从我的首页点击进来的,那没问题,照常显示 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("路飞做了XXXXxxxxxxxxxxxxxxxx");

简介

web容器在运转时,它会为每一种web应用程序都创设三个对应的ServletContext对象,它意味着着脚下web应用。(在那之中有管理、获取当前web应用的法门)

ServletConfig对象中保证了一ServletContext目的的援引,开辟人士在编辑servlet时.

  • 能够透过ServletConfig.getServletContext()格局获得ServletContext对象。
  • this.getServletContext()

翻开ServletContext API文书档案,精通ServeltContext对象的法力。

  • getAttribute(java.lang.String name)
  • getContext(java.lang.String uripath)
  • getInitParameterNames()
  • getAttributeNames()
  • 。。。
  • 首先按常规预想的,旁人从首页点击自身的财富,访谈小编海贼王最新的财富

行使场景

  1. 由于一个web应用中的全部servlet分享同四个ServletContext对象,所以多少个servlet通过ServletContext对象实现数据分享。

    • ServletContext对象平常也被称之为context域对象(应用程序范围,上下文)
    • (web开垦唯有七个域:context,request,session,page)。
    • context域:应用程序(web容器)范围都能够访谈的!
    • 动用场景:聊天室,聊天的话,相互在servlet中去对方的对话。
  2. ServletContext域:

    • 那是三个容器
    • ServletContext域表达了那些容器的效果与利益范围,也正是应用程序的意义的范围
  3. 获得web应用的初阶化参数

<context-param>
    <param-name>data</param-name >
    <param-value>xxxx</param-value >
</context-param>

- 加载web容器时,将上面的参数,自动加载到ServletContext对象中。
-  this.getServletContext().getInitParameter("data");
- 应用场景:连接数据库的信息,不可能为每个servlet配置数据库信息。全局的!
  1. 通过context实现servlet的转发

    • 转载:你问作者借钱,小编尚未,作者帮你找旁人去借:servlet不切合做多少输出,数据转载给jsp做输出(展现)。
    //把数据转发给1.jsp做展示
    String data="aaa";
    this.getServletContext().setAttirbute("data",data);
    this.gerServletContext().getRequestDispatcher("1.jsp").forward(request,response)
    
    //jsp页面 ServletContext==application但是数据时全局共享的,不适合通过context域,用request域做。
    <%
         String data = (String)application.getAttribute("data");
         out.write(data);
    %>
    
    • 重定向:你问小编借钱,小编未曾,笔者令你找旁人去借
  2. 行使ServletContext对象读取能源文件:配置文件有三种:数据里面无妨用.properties;数据里面有涉及用.xml

    • 收获文件路线
    //注意是tmocat发布web应用的目录,编译之后的,classes文件下面!!!
    //读取资源文件需要注意的问题:下面代码不可行,最好采用ServletContext来读资源文件的位置。
    public class ServletDemo extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         text();
    }
    
    private void test() throws IOException{
    FileInputStream in=new FileInputStream("/classes/db.properties");//这将会是java虚拟机的路径,tomcat根目录
    Properties props=new Properties();//Properties是个Map
    props.load(in);
    
    String url = props.getProperty("url");
    String username = props.getProperty("username");
    String password = props.getProperty("password");
    }
    
    //通过servletContext的个体RealPath得到资源的绝对路径后,再通过传统流读取资源文件(能拿到资源文件的名称path)
    private void test1() throws IOException{
    String path=this.getServletContext().getRealPath("/WEN-INF/classes/db.properties");
    FileInputStream in=new FileInputStream(path);
    Properties props=new Properties();//Properties是个Map
    props.load(in);
    
    String url = props.getProperty("url");
    String username = props.getProperty("username");
    String password = props.getProperty("password");
    }
    
    }
    
    • 读取能源文件的三种格局
    //注意是tmocat发布web应用的目录,编译之后的,classes文件下面!!!
    //1.读取资源文件:
    InputStream in=this.getServletContext().getResourxeAsStream("/WEB-INF/classes/db.properties");
    //2.读取资源文件:资源文件在包内
    InputStream in=this.getServletContext().getResourxeAsStream("/WEB-INF/classes/cn/itcast/db.properties");
    //3.读取资源文件:资源文件在根目录,webroot/WEB-INF
    InputStream in=this.getServletContext().getResourxeAsStream("/db.properties");
    Properties props=new Properties();//Properties是个Map
    props.load(in);
    
    String url = props.getProperty("url");
    String username = props.getProperty("username");
    String password = props.getProperty("password");
    
    • .properties文件(属性文件)
    //db.properties
    url=jdbc:mysql://localhost:3306/test
    username=root
    password=root
    
  3. WEB应用中的普通Java程序(非servlet程序)怎么着读取财富文件:

    • 尽管读取财富文件的前后相继不是servlet的话,就只好通过类装载器去读了:类装载器-->字节码-->反射
    //以下代码虽然可以读取资源文件的数据,但是无法获取更新后的数据
    public class UserDao{
    
         private static Properties dbconfig = new Properties();
         static{         
              try{
                   InputStream in =UserDao.class.getClassLoader().getResourceAsStream("db.properties");
                   dbconfig.load(in);
              }catch (Exception e){
                  throw new ExceptionInInitialzerError(e); 
              }
         }
         public void update(){
              System.out.println(dbconfig.getProperty("url"));
         }
    }
    
    • servlet调用别样程序(非servlet程序),在任何程序中怎么什么去读取能源文件(通过类装载,文件无法太大,它是按类装载方式装载在内部存款和储蓄器中,只装载叁回)
         //修改配置文件,就会出现还是读取类装载读取的原配置文件
         //通过类装载器的方式得到资源文件的位置,再通过传统方式读取资源文件的数据,这样可以读取到更新后的数据
         String path = UserDao.class.getClassLoader().getResource("db.properties").getPath();
         FileInputStream in = new FileInputStream(path);
         Properties dbconfig = new Properties();
         dbconfig.load(in);
         System.out.println(dbconfig.getProperty("url"));
    

澳门金莎娱乐网站 4image

  • 可见成功访问到财富

澳门金莎娱乐网站 5image

  • 要是笔者在浏览器直接输入地方【此时Referer是为null的】,我们来拜望

澳门金莎娱乐网站 6image

  • 跳回到首页上,不能访谈到海贼王财富

澳门金莎娱乐网站 7image

  • 再试试,如果外人粘贴了本身的财富url,在它的网页上挂了三个网站呢。

澳门金莎娱乐网站 8image

  • 在别人网页上点击的时候

澳门金莎娱乐网站 9image

  • 又跳回到了自家的首页了。 澳门金莎娱乐网站 10image
<form action="/zhongfucheng/Servlet111" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td>性别</td> <td> <input type="radio" name="gender" value="男">男 <input type="radio" name="gender" value="女">女 </td> </tr> <tr> <td>爱好</td> <td> <input type="checkbox" name="hobbies" value="游泳">游泳 <input type="checkbox" name="hobbies" value="跑步">跑步 <input type="checkbox" name="hobbies" value="飞翔">飞翔 </td> </tr> <input type="hidden" name="aaa" value="my name is zhongfucheng"> <tr> <td>你的来自于哪里</td> <td> <select name="address"> <option value="广州">广州</option> <option value="深圳">深圳</option> <option value="北京">北京</option> </select> </td> </tr> <tr> <td>详细说明:</td> <td> <textarea cols="30" rows="2" name="textarea"></textarea> </td> </tr> <tr> <td><input type="submit" value="提交"></td> <td><input type="reset" value="重置"></td> </tr> </table>
  • 在Servlet11第11中学拿到到提交的数目,代码如下
 //设置request字符编码的格式 request.setCharacterEncoding; //通过html的name属性,获取到值 String username = request.getParameter("username"); String password = request.getParameter("password"); String gender = request.getParameter; //复选框和下拉框有多个值,获取到多个值 String[] hobbies = request.getParameterValues("hobbies"); String[] address = request.getParameterValues("address"); //获取到文本域的值 String description = request.getParameter("textarea"); //得到隐藏域的值 String hiddenValue = request.getParameter; ....各种System.out.println().......
  • 向表单输入数据

澳门金莎娱乐网站 11image

  • Servlet111拿走表单带过来的数据,最后的三个多少是隐敝域带过来的。

澳门金莎娱乐网站 12image

科学普及的get格局提交数占有运用超链接,sendRedirect()

格式如下:

 sendRedirect("servlet的地址?参数名="+参数值 &"参数名="+参数值);
  • 我们来使用一下,透过超链接将数据带给浏览器
 <a href="/zhongfucheng/Servlet111?username=xxx">使用超链接将数据带给浏览器</a>
  • 在Servlet111接收数据
 //接收以username为参数名带过来的值 String username = request.getParameter("username"); System.out.println;
  • 注意看浏览器左下角

澳门金莎娱乐网站 13image

  • 服务器成功接收到浏览器发送过来的数码

澳门金莎娱乐网站 14image

  • 并且,传输数据明文的面世在浏览器的地方栏上

澳门金莎娱乐网站 15image

  • sendRedirect()和超链接类似,在这边就不赘述了

有心人的爱侣会意识,我在收获表单数据的时候,有那句代码request.setCharacterEncoding;,若无那句代码,会生出什么事呢?大家看看。

  • 再重新填写数据

澳门金莎娱乐网站 16image

  • 在服务器查看提交过来的数据,装有的汉语数据都乱码了

澳门金莎娱乐网站 17image

  • 来此处大家来深入分析一下乱码的案由,在眼下的博客中本人已经介绍了,汤姆cat服务器默许编码是ISO 8859-1,而浏览器选拔的是UTF-8编码。浏览器的国语数据提交给服务器,汤姆cat以ISO 8859-1编码对粤语编码,当本人在Servlet读取数据的时候,得到的自然是乱码。而自身设置request的编码为UTF-8,乱码就消除了。

  • 接下去使用get情势传送汉语数据,把表单的措施改成get即可

  • 当大家拜会的时候,又并发乱码了!

澳门金莎娱乐网站 18image澳门金莎娱乐网站 19image

  • 于是自个儿根据上面包车型客车办法,把request对象设置编码为UTF-8试试
 request.setCharacterEncoding; String name = request.getParameter;
  • 结果或然乱码。那是干吗吗?自个儿明白已经把编码设置成UTF-8了,依照post格局,乱码难题已经化解了!。我们来看看get和post方式的界别在哪?何以post格局设置了request编码就能够解决乱码难点,而get格局不可能啊。

  • 率先大家来看一下post方法是怎么实行参数字传送递的。当大家点击提交按键的时候,数据封装进了Form Data中http央求中把实体中央带过去了【传输的多寡称之为实体中央】,既然request对象封装了http央浼,所以request对象能够剖析到发送过来的多少,于是只要把编码设置成UTF-8就足以消除乱码难点了

澳门金莎娱乐网站 20image

  • 而get格局各异,它的数据是从新闻行带过去的,未有包装到request对象里面,所以采纳request设置编码是船到江心补漏迟的。

澳门金莎娱乐网站 21image

  • 要缓解get格局乱码难点也不难,大家既然知道汤姆cat暗许的编码是ISO 8859-1,那么get格局由音讯体带过去给浏览器的时候肯定是用ISO 8859-1编码了
 //此时得到的数据已经是被ISO 8859-1编码后的字符串了,这个是乱码 String name = request.getParameter("username"); //乱码通过反向查ISO 8859-1得到原始的数据 byte[] bytes = name.getBytes("ISO8859-1"); //通过原始的数据,设置正确的码表,构建字符串 String value = new String(bytes, "UTF-8");

地点的代码有个别难精晓,小编画张图说澳优(Aptamil)下:

澳门金莎娱乐网站 22image

  • 通过大家手工业调换,再来访问一下

澳门金莎娱乐网站 23image

  • 好的,成功化解掉乱码难点了。

  • 除此而外手工业调换,get格局还是能改汤姆cat服务器的布置来化解乱码,可是不引入应用,那样不利索。

  • 咱俩都清楚Tomcat暗中同意的编码是ISO 8859-1,借使在汤姆cat服务器的布局下改成是UTF-8的编码,那么就化解服务器在深入分析数据的时候产生乱码难点了

  • 在8080端口的Connector上加入URIEncoding="utf-8",设置汤姆cat的拜谒该端口时的编码为utf-8,进而消除乱码,这种改法是定位使用UTF-8编码的

 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
  • 澳门金莎娱乐网站,设置了编码后,未有做其余手工业转变,成功获得数码

澳门金莎娱乐网站 24image

  • 自然也可以有另一种改服务器编码的格局。设置Tomcat的会见该端口时的编码为页面包车型大巴编码,这种改法是随着页面包车型客车编码而变
 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
  • 安装编码为UTF-8
 request.setCharacterEncoding; String name = request.getParameter;
  • 再也做客

澳门金莎娱乐网站 25image

  • 手写超链接倘诺附带汉语参数难点,要U汉兰达L重写,在JSP博客中会讲到

  • 总结:

  • post情势直接改request对象的编码

  • get方式索要手工业转变编码

  • get方式也得以修改汤姆cat服务器的编码,不引入,因为会太依仗服务器了!

  • 交付数据能用post就用post

事先讲过使用response的sendRedirect()能够达成重定向,做到的功能是页面跳转,使用request的getRequestDispatcher.forward(request,response)落实转载,做到的成效也是页面跳转,他们有如何差别吗?将来自家先来讲下转账

  • 代码如下所示
 //获取到requestDispatcher对象,跳转到index.jsp RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp"); //调用requestDispatcher对象的forward()实现转发,传入request和response方法 requestDispatcher.forward(request, response);
  • 访问Servlet111

澳门金莎娱乐网站 26image

  • 地点已经说了,能够透过sendRedirect()重定向能够在财富尾巴部分增加参数提交数据给服务器。那么转载能或不可能交到数据给服务器呢?

  • 答案分明是足以的,並且应用这种格局丰硕频仍

  • 在讲ServletContext的时候,业已说过Servlet之间能够由此ServletContext完毕通信,ServletContext也能称之为域对象。而request也得以称之为域对象,只不过ServletContext的域是一体web应用,而request的域仅仅代表一次http诉求

  • 下边大家来使用request完成Servlet之间的广播发表,Servlet111代码

 //以username为关键字存zhongfucheng值 request.setAttribute("username", "zhongfucheng"); //获取到requestDispatcher对象 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Servlet222"); //调用requestDispatcher对象的forward()实现转发,传入request和response方法 requestDispatcher.forward(request, response);
  • Servlet222代码
 //获取到存进request对象的值 String userName =  request.getAttribute("username"); //在浏览器输出该值 response.getWriter().write("i am :"+userName);
  • 探访Servlet111看下效果

澳门金莎娱乐网站 27image

  • 如上航海用教室所示,Servlet222得逞得到了request对象在Servlet111存进的多寡

  • 今九章题又来了,大家可以运用ServletContext和request达成Servlet之间的通信,那么大家用哪个种类呢?日常的法则:可以利用request就玩命使用request。因为ServletContext代表着全套web应用,使用ServletContext会消耗大量的能源,而request对象会随着央浼的终结而终结,能源会被回收选拔request域实行Servlet之间的电视发表在支付中是极度频仍的

澳门金莎娱乐网站 28image

  • 如果在调用forward方法以前,在Servlet程序中写入的有些内容已经被真正地传递到了顾客端,forward方法将抛出IllegalStateException非凡。 也正是说:不要在倒车以前写多少给浏览器

  • 笔者们来试试看是否真的会出现非常。

 OutputStream outputStream = response.getOutputStream(); outputStream.write("--------------------------------------------".getBytes; //关闭流,确保让数据到浏览器中 outputStream.close(); //跳转 request.getRequestDispatcher.forward(request, response);
  • 做客的时候,看见浏览器能够输出数据,汤姆cat后台抛出了这一个

澳门金莎娱乐网站 29image

  • 若果在调用forward方法以前向Servlet引擎的缓冲区中写入了内容,假使写入到缓冲区中的内容还并未有被真正输出到客户端,forward方法就能够被正常实行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段消息保持有效

其实发生地方区别,地址栏不相同

  • 转载是产生在服务器的
    • 倒车是由服务器进行跳转的,留意的对象会开采,在中间转播的时候,浏览器的地址栏是不曾爆发变化的,在本人访谈Servlet111的时候,固然跳转到了Servlet222的页面,浏览器的地方还是Servlet111的。也正是说浏览器是不知道该跳转的动作,转发是对浏览器透明的。通过上边的转折时序图大家也能够窥见,福衢寿车转载只是一次的http乞请一回转化中request和response对象都是同三个。这也批注了,为啥能够行使request作为域对象开展Servlet之间的报道。
  • 重定向是发生在浏览器的
    • 重定向是由浏览器实行跳转的,举办重定向跳转的时候,浏览器的地点会产生变化的。曾经介绍过:完结重定向的规律是由response的状态码和Location头组合而落到实处的。那是由浏览器进行的页面跳转落到实处重定向会产生五个http央求request域对象是对事情未有什么帮助的,因为它不是同八个request对象

用法不相同

有的是人都搞不清楚转载和重定向的时候,财富地址终归怎么写。一时要把施用名写上,不时绝不把利用名写上。很轻便把人搞晕。记住五个标准:给服务器用的第一手从资源名起头写,给浏览器用的要把施用名写上

  • request.getRequestDispatcher("/资源名 URI").forward(request,response)
    • 转车时"/"代表的是本应用程序的根目录【zhongfucheng】
  • response.send("/web应用/资源名 URI");
    • 重定向时"/"代表的是webapps目录

可见去往的UCR-VL的限量分裂

  • 转载是服务器跳转只好去往当前web应用的财富
  • 重定向是服务器跳转,能够去往任何的能源

传递数据的档案的次序分歧

  • 倒车的request对象足以传递各种类型的数量,包罗对象
  • 重定向只好传递字符串

跳转的时刻各异

  • 中间转播时:施行到跳转语句时就能马上跳转
  • 重定向:整个页面实施完之后才施行跳转

依附地点表达了转载和重定向的分别也足以很轻松回顾出来。转载是带着转会前的伏乞的参数的。重定向是新的呼吁

一级的使用场景:

  1. 转发: 访谈 Servlet 处监护人业逻辑,然后 forward 到 jsp 显示管理结果,浏览器里 U凯雷德L 不改变
  2. 重定向: 提交表单,处理成功后 redirect 到另一个jsp,幸免表单重复提交,浏览器里 URubiconL 变了

RequestDispatcher对象调用forward()能够兑现转载上边已经说过了。RequestDispatcher还会有别的二个艺术include(),该格局能够兑现包罗,有如何用吗?

我们在写网页的时候,日常网页的尾部和尾巴部分是无需更动的。假使大家多少个地点使用Servlet输出网头和网尾的话,供给把代码重新写三回。而使用RequestDispatcher的include()方法就可以完结包蕴网头和网尾的功力了

  • 我们来操作吧!未来作者有网头和网尾的Servlet

澳门金莎娱乐网站 30image

  • 采纳Servlet111将网头和网尾包括
 request.getRequestDispatcher.include(request, response); response.getWriter().write("--------------------------------------------"); request.getRequestDispatcher.include(request, response);
  • 拜候一下Servlet111,成功把网头和网尾包罗了

澳门金莎娱乐网站 31image

假使小说有错的地方招待指正,大家互相交换。习惯在微信看技能文章的同室,能够关切微教徒人号:Java3y

编辑:编程技术 本文来源:request对象常用方法

关键词: