JavaWeb_request_response(下)

HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

Request常用方法

获得客户机信息

• getRequestURL方法返回客户端发出请求时的完整URL

• getRequestURI方法返回请求行中的资源名部分。

• getQueryString 方法返回请求行中的参数部分。

• getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

• getRemoteAddr方法返回发出请求的客户机的IP地址

• getRemoteHost方法返回发出请求的客户机的完整主机名

• getRemotePort方法返回客户机所使用的网络端口号

• getLocalAddr方法返回WEB服务器的IP地址。

• getLocalName方法返回WEB服务器的主机名

package cn.itcast.request;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class RequestDemo1 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println(request.getRequestURI());

System.out.println(request.getRequestURL());

System.out.println(request.getQueryString());

System.out.println(request.getRemoteAddr ());

System.out.println(request.getRemoteHost());

System.out.println(request.getRemotePort());

System.out.println(request.getMethod());

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}

IE中输入http://localhost:8080/day06/servlet/RequestDemo1 得到

/day06/servlet/RequestDemo1

http://localhost:8080/day06/servlet/RequestDemo1

null

127.0.0.1

127.0.0.1

3112

GET

获得客户机请求头

• getHeader方法 

• getHeaders方法 

• getHeaderNames方法 

package cn.itcast.request;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import java.util.Enumeration;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

//获取请求头

public class RequestDemo2 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

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

System.out.println(headValue);

System.out.println("--------------------");

Enumeration e= request.getHeaders("Accept-Encoding");

        while(e.hasMoreElements()){

         String value=(String) e.nextElement();

         System.out.println(value);

           

        System.out.println("---------另一种方法-----------");

        e=request.getHeaderNames();

while(e.hasMoreElements()){

String name=(String)e.nextElement();

String value =request.getHeader(name);

System.out.println(name +"=" +value);

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}

Console中输出结果

gzip, deflate

--------------------

gzip, deflate

---------另一种方法-----------

accept=application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, *

        System.out.println("---------获取数据方式4-----------");

        //Map<String, String[]> map=request.getParameterMap();

        Map map= request.getParameterMap();//开发中常用的(简化代码)

        User user =new User();

try {

BeanUtils.populate(user, map);//username String[]//map集合数据填充bean

//BeanUtils.copyProperty(user, formbean);bean的拷贝

catch (Exception e1) {

e1.printStackTrace();

System.out.println(user);

System.out.println("---------获取数据方式5-----------");

        InputStream in=request.getInputStream();

        int len=0;

        byte buffer[]=new byte[1024];//用到流就必须要这个框架,实际开发不太用

        while((len=in.read())>0){//处理文件上传的

         System.out.println(len);

         System.out.println(new String (buffer,0,len));

        }

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}


Text.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>带数据给requestDemo2</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">//模拟了一些头

    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

  </head>

  <body>

    <a href="/day06/servlet/RequestDemo2?username=xxx">点点</a>

    <form action="/day06/servlet/RequestDemo2" method="post">

                   用户名1: <input type="text" name="username"><br/>

                  <!--   用户名2: <input type="text" name="username"><br/>-->

                   密码<input type="text" name="password"><br/>

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

    </form>

  </body>

</html>

User.java(在获取数据方式4-里用到的)

package cn.itcast.url;

public class User {

private String username;

private String passwrod;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username username;

}

public String getPasswrod() {

return passwrod;

}

public void setPasswrod(String passwrod) {

this.passwrod passwrod;

}

}输出结果:

注意,本代码中的在获取数据方式4中,需要两个jar包,commons-logging.jar和commons-beanutils-1.8.3.jar

--------获取数据方式1------------

xxxx

--------获取数据方式2------------

password=123

username=xxxx

---------获取数据方式3-----------

Xxxx

Yyyyy

---------获取数据方式4-----------

cn.itcast.url.User@8ca0d9

 

request常见应用1

防盗链

各种表单输入项数据的获取

• textpasswordradiocheckbox

• fileselecttextarea、 hidden

• imagebuttonjs编程用

form.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>form.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">    

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>

  <body>

    <form action="/day06/servlet/RequestDemo3" method="post">

                   用户名<input type="text" name="username"><br/>

                   密码:<input type="password" name="password"><br/>

                   性别: <input type="radio" name="gender" value="male">男  

                          <input type="radio" name="gender" value="female"><br/>        

                   所在地:<select name="city">

                           <option value="beijing" >北京</option>

                           <option value="shanghai" >上海</option>

                           <option value="cs" >长沙</option>

                           </select><br/>

                   爱好: <input type="checkbox" name="likes" value="sing">唱歌

                          <input type="checkbox" name="likes" value="dance">跳舞

                          <input type="checkbox" name="likes" value="basketball">篮球

                          <input type="checkbox" name="likes" value="football">足球 <br/>

       备注:<textarea rows="6" cols="60" name="description"></textarea> <br/>

       大头照:<input type="file" name="image"><br/>

        <input type="hidden" name="id" value="12356">     

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

    </form>

  </body>

</html>

package cn.itcast.request;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class RequestDemo3 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println(request.getParameter("username"));

System.out.println(request.getParameter("password"));

System.out.println(request.getParameter("gender"));

System.out.println(request.getParameter("city"));

String likes[]=request.getParameterValues("likes");

for(int i=0;likes!=null&&i<likes.length;i++){

System.out.println(likes[i]);

}

System.out.println(request.getParameter("description"));

System.out.println(request.getParameter("id"));

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}

IE中输入http://localhost:8080/day06/form.html 输入相应的值,在Console下得到数值


请求参数的中文乱码问题 

form.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>中文 乱码问题</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

  </head>

  <body> 

    <form action="/day06/servlet/RequestDemo4" method="post">

                   用户名1: <input type="text" name="username"><br/>

                           <input type="submit" value="提交"><br/>

    </form>

    <form action="/day06/servlet/RequestDemo4" method="get">

                   用户名1: <input type="text" name="username"><br/>

                           <input type="submit" value="提交"><br/>

    </form>

    <!-- 超链接提交的中文,服务器想不乱码,也只能手工处理 -->

    <a href="/day06/servlet/RequestDemo4?username=中国">点点</a>

  </body>//超链中的中文,用解决post的方法来解决

</html>

 

package cn.itcast.request;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class RequestDemo4 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//request.setCharacterEncoding("UTF-8");//解决post乱码只对post提交有效

String username request.getParameter("username");

//解决get提交的乱码(手工处理)

username=new String(username.getBytes("iso8859-1"),"UTF-8");

System.out.println(username);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

IE中输入http://localhost:8080/day06/form3.html

还有一种是改服务器的配置,但是这种只需要了解的,


request常见应用2

request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。

请求转发的应用场景:MVC设计模式(jsp中不能出现一行java代码)

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

ü setAttribute方法 

ü getAttribute方法  

ü removeAttribute方法

ü getAttributeNames方法

package cn.itcast.request;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 //请求转发,以及使用request就对象把数据带给转发资源

//请求转发的特点:

//1、客户端只发一个请求,而服务器有多个资源调用

//2、客户端浏览器地址栏没有变化

public class RequestDemo5 extends HttpServlet {

//MVC(M(model) javabean封装       V(view)jsp输出      C:cotroller(servlet))控制

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String data ="aaaaaa";

request.setAttribute("data", data);

//request也可以实现转发

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

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}


Message.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>My JSP 'message.jsp' starting page</title>

</head>

<body>

${data}    //el表达式与下个一样的含义

<%

String data (String) request.getAttribute("data");

out.write(data);

%>

<%

String message (String) application.getAttribute("message");

out.write(message);

%>

</body>

</html>//IE中输入http://localhost:8080/day06/servlet/RequestDemo5  立即转到 message.jsp输出


请求转发的细节 

forward方法用于将请求转发到RequestDispatcher对象封装的资源。

如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。 

package cn.itcast.request;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

//forward的细节

public class RequestDemo6 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String data ="aaaaaa";

PrintWriter writer= response.getWriter();

writer.write(data);

writer.close();

//以下跳转会导致:java.lang.IIIegalStateExcption Cannot forward after response has been committed

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

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

}

Index.jsp是上次的,


 

如果在调用forward方法之前向Servlet引擎的缓冲区中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。 

package cn.itcast.request;

import java.io.IOException;

……………………………..

//forward时,会清空response中的数据

public class RequestDemo7 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String data "aaaaa";

response.getWriter().write(data);

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

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'index.jsp' starting page</title>

  </head>

  <body>

    <a href="/day06/servlet/ResponseDemo6" >bbbbb</a>

  </body>

</html>在IE中输入http://localhost:8080/day06/servlet/RequestDemo7 输出的页面是bbbbb 覆盖了aaaaa


请求重定向和请求转发的区别 

一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。

 一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 

如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。 

调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。 

RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。 

RequestDispatcher

include方法:

• RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能。

• 被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。

package cn.itcast.request;

import java.io.IOException;

…………………………

//include实现页面包含

public class RequestDemo8 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.getRequestDispatcher("/public/head.jsp").include(request, response);

response.getWriter().write("hahahahh<br/>");

request.getRequestDispatcher("/public/foot.jsp").include(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

 }

}

WEB-INF目录新建一个文件public,在里面建立两个jsphead.jspfoot.jsp

(在被包含的页面里不能出现那些全局架构标签)

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    head <br>

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

    foot<br>

 

l 总结web工程中各类地址的写法

package cn.itcast.url;

import java.io.IOException;

…………………………...

//web工程中各类地址的写法

public class ServletDemo1 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1

request.getRequestDispatcher("/formm1.html").forward(request, response);

//2重定向

response.sendRedirect("/day06/form1.html");

//3

this.getServletContext().getRealPath("/form1.html");

//4

this.getServletContext().getRealPath("/public/foot.jsp");

//5

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response); 

 }

}


防盗链

package cn.itcast.request;

import java.io.IOException;

…………………………….

//防盗链(打开页面之后,先看广告,后看内容,就要是打广告的)

public class RequestDemo9 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String referer request.getHeader("referer");

if (referer == null || !referer.startsWith("http://localhost")) {

response.sendRedirect("/day06/index.jsp");

return;

}

String data "凤姐日记";

response.getWriter().write(data);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My JSP 'index.jsp' starting page</title>

  </head>

  <body>

     <a href="/day06/servlet/ResponseDemo6">bbbbb</a>

    <br/>看广告<br/>

    <a href="/day06/servlet/RequestDemo9">看凤姐</a>

  </body>

</html>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值