request和response常用方法、跳转&重定向

目录

请求Request

响应Response

跳转页面两种方式(转发与重定向)

请求Request

HttpServletRequest 表示 Http 环境中的 Servlet 请求。它扩展于 javax.servlet.ServletRequest 接⼝ )
 
常⽤6个⽅法:
 
1)String getParameter(String name)
 
根据表单组件名称name获取提交的数据,返回值是 String
 
注:服务器在接收数据时使⽤字符串统⼀接收
 
2)String[ ] getParameterValues(String name)
 
获取表单组件对应多个值时的请求数据比如复选框
 
3)void setCharacterEncoding(String charset)
 
指定每个请求的编码 ( 针对 post 请求才起作⽤ )
 
4)RequestDispatcher getRequestDispatcher(String path)
 
-- 跳转⻚⾯,当用户发送的请求在servlet中被允许后跳转到其它页面展示给用户。
 
返回⼀个 RequestDispatcher 对象,该对象的 forward( ) ⽅法⽤于转发请求
 
/表示web目录
 
5)存值 request.setAttribute("key",value);
 
6)取值 request.getAttribute("key"); // 取值后需要向下转型
 
存值取值成对出现

前台通过超链接或表单给后台数据:后台通过req.getParameter()获取

后台通过req.setAttribute("key",value)给前台数据:在跳转页面通过req.getAttribute("key")获取数据传给前台

request存值范围 :是单次请求有效,也就是一个来回的请求和响应期间这个值有效。
 
补充1:客户端如何发送数据给服务器
 
⽅式1:通过表单 get/post提交
 
⽅式2:通过a标签发送数据(get提交)
 
这⾥的 key = 表单元素的控件名, value = 表单中控件的 value 属性值
 
: 第⼀个参数使⽤ ? 拼接 , 之后的参数使⽤ & 拼接,
 
获取数据还是通过 String name=request.getParameter("name");
 
⽅式3:通过地址栏直接拼接-get请求
 
⽅式4:js提交数据-get请求
 
location.href=" ⽬标请求 ?key=value&key=value"
 
补充2:处理请求乱码的问题(get/post分别怎么处理乱码)
 
⽅式 1 setCharacterEncoding("UTF-8");//post 提交时管⽤
 
⽅式 2: String s=new String( 变量名 .getBytes("ISO-8859-1"),"UTF-8");// 针对于 get 提交时中⽂乱码
 
示例 : String s=new String(request.getParameter("key").getBytes("ISO-8859-1"),"GBK");
 
⽅式 3 :修改 tomcat 中配置⽂件 :// 使⽤于 get 提交
 
Tomcat ⽬录结构 \conf\server.xml 中设置字符集
 
注意 :tomcat8.0 以后不需要⼿动设置这个属性了
 
补充3:get和post的区别
 
1 GET 请求,请求的数据会附加在 URL 之后,以 ? 分割 URL 和传输数据,多个参数⽤ & 连接。 URL 的编码格式采⽤的是ASCII 编码,⽽不是 uniclde ,即是说所有的⾮ ASCII 字符都要编码之后再传输。
 
POST 请求: POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上⾯的 item=bandsaw 就是实际的传输数据。因此,GET 请求的数据会暴露在地址栏中,⽽ POST 请求则不会。
 
2 传输数据的⼤⼩
 
HTTP 规范中,没有对 URL 的⻓度和传输的数据⼤⼩进⾏限制。但是在实际开发过程中,对于 GET ,特 定的浏览器和服务器对URL 的⻓度有限制。因此,在使⽤ GET 请求时,传输数据会受到 URL ⻓度的限制。
 
对于 POST ,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST 提交数据⼤⼩进⾏限制,Apache IIS 都有各⾃的配置。
 
3 安全性
POST 的安全性⽐ GET 的⾼。这⾥的安全是指真正的安全,⽽不同于上⾯ GET 提到的安全⽅法中的安全, 上⾯提到的安全仅仅是不修改服务器的数据。⽐如,在进⾏登录操作,通过GET 请求,⽤户名和密码都会暴露再URL 上,因为登录⻚⾯有可能被浏览器缓存以及其他⼈查看浏览器的历史记录的原因,此时的⽤户名和密码就很容易被他⼈拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site request frogery攻击
 

响应Response

Service API 中,定义了⼀个 HttpServletResponse 接⼝,它继承⾃ ServletResponse 接⼝, 专⻔⽤来封 装HTTP响应消息 HttpServletResponse 接⼝中定义了向客户端发送 响应状态码,响应消息头,响应消息体 的⽅法。
 
常⽤4个⽅法:
 
void addCookie (Cookie var1);// 给这个响应添加⼀个 cookie
 
void sendRedirect (String var1) ;// 发送⼀条响应码,将浏览器跳转到指定的位置
 
PrintWriter getWriter () 获得字符流,通过字符流的 write(String s) ⽅法可以将字符串设置到 response缓冲区中,随后Tomcat会将 response 缓冲区中的内容组装成 Http 响应返回给浏览器端。
 
setContentType() 设置响应给客户端的内容的类型比如是文档类型text/html
 
 
演示:
 
先导入javaee-api-7.0.jar
 
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>1.这是第一个javaweb项目</h1>
    <a href="test">test first servlet</a>

    <form action="test" method="post">
        <input type="submit" value="post-test">
    </form>

    <h1>2.测试request</h1>
    <!--get方式请求-->
    <a href="testrequest?upass=abc&uname=李四">test-request-get</a>
    <!--post方式请求-->
    <form action="testrequest" method="post">
        uname:<input type="text" name="username">
        upass:<input type="text" name="userpass">
        hobby:<input type="checkbox" name="hobby" value="music">音乐
              <input type="checkbox" name="hobby" value="run">跑步
              <input type="checkbox" name="hobby" value="film">电影
        <input type="submit" value="提交">
    </form>
</body>
</html>

web.xml进行映射

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>first servlet</servlet-name>
        <!--servlet全类名,这个servlet与下面路径进行映射,通过下面页面路径访问这个servlet-->
        <servlet-class>web.TestServlet</servlet-class>
    </servlet>
    <!--servlet映射-->
    <servlet-mapping>
        <servlet-name>first servlet</servlet-name>
        <url-pattern>/test</url-pattern><!--页面的请求地址-->
    </servlet-mapping>

    <servlet>
        <servlet-name>test request</servlet-name>
        <!--servlet全类名,这个servlet与下面路径进行映射,通过下面页面路径访问这个servlet-->
        <servlet-class>web.UserServlet</servlet-class>
    </servlet>
    <!--servlet映射-->
    <servlet-mapping>
        <servlet-name>test request</servlet-name>
        <url-pattern>/testrequest</url-pattern><!--页面的请求地址-->
    </servlet-mapping>
</web-app>

UserServlet.java处理请求

package web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class UserServlet extends HttpServlet {
    //注:服务器在接收数据时使⽤字符串统⼀接收
    @Override//接收get请求:超链接
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //tomcat8以后get请求不需要处理乱码问题
        //getParameter方法接收用户传递过来的参数,参数已经被封装到req对象中
        String uname = req.getParameter("uname");
        String upass = req.getParameter("upass");
        System.out.println("通过超链接的get请求方式获取到"+"uname:"+uname+",upass:"+upass);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理post请求的乱码
        req.setCharacterEncoding("utf-8");
        //getParameter方法接收用户传递过来的参数,通过键找值,input中的键就是name,参数已经被封装到req对象中
        String username = req.getParameter("username");
        String userpass = req.getParameter("userpass");
        //getParameterValues获取表单组件对应多个值,比如这个复选框
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.print(hobby+" ");
        }
        //前台通过超链接或表单给后台数据:后台通过req.getParameter()获取
        //后台通过req.setAttribute("key",value)给前台数据:在跳转页面通过req.getAttribute("key")获取数据传给前台
        //存值取值成对出现。
        //request存值范围 :是单次请求有效,也就是一个来回的请求和响应期间这个值有效。
        req.setAttribute("username",username);
        req.setAttribute("userpass",userpass);
        Object usename = req.getAttribute("usename");
        Object userpass1 = req.getAttribute("userpass");

        System.out.println("通过表单的post请求方式获取到"+"username:"+username+"userpass:"+userpass);

        //响应:服务器给客户端信息
        resp.setContentType("text/html");//设置响应给客户端的内容的类型比如是文档类型text/html
        //resp.addCookie();设置cookie值存储
        PrintWriter writer = resp.getWriter();//获取一个给前端输出信息的输出流对象
        //处理完数据,跳转页面到success.html,这里使用的是req的转发跳转页面 ,/表示从web目录下
        //转发跳转到新页面后,地址栏地址还是之前的地址http://localhost:8080/testrequest
        //req.getRequestDispatcher("/success.html").forward(req,resp);
        //这个是resp的重定向跳转页面,地址栏地址发生变化http://localhost:8080/success.html
        resp.sendRedirect("/success.html");
    }
}


 

转发跳转到新页面后,地址栏地址还是之前的地址http://localhost:8080/testrequest

这个是resp的重定向跳转页面,地址栏地址发生变化http://localhost:8080/success.html
 

跳转页面两种方式(转发与重定向)

重定向和转发的对⽐
 
 
重定向:response.sendRedirect()
转发:request.getRequestDispatcher("../success.jsp").forward(request,response);

相同点:都⽤来跳转⻚⾯

不同点 :
 
重定向时地址栏会改变 ,request 中存储的数据会丢失 . 转发时地址栏显示的是请求⻚⾯的地址,request 数据可以保存。
 
转发属于⼀次请求⼀次响应 , 重定向属于两次请求 ( 地址栏修改了两次 ) 两次响应。
 
补充 : 使⽤ out 对象往⻚⾯中输出 js html,css
out.print("<script type='text/javascript'>alert('登录失
败');location='../login.jsp'</script>");
: 使⽤ js 跳转⻚⾯,也会丢失 request 中的数据
 
 
 
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值