丨你微笑时好美丶

博客园 首页 联系 订阅 管理

获得客户端请求参数(客户端提交的数据)

  • getParameter(name)方法
  • getParameterValues(String name)方法    获取一个参数的多个值
  • getParameterNames方法
  • getParameterMap方法  //做框架用,非常实用
  • getInputStream
package com.zx.web.servlet;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Lesson01Servlet")
public class Lesson01Servlet extends HttpServlet{
    
    @Override
    protected void doGet(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        /*Enumeration<String> e= requset.getParameterNames();
        while (e.hasMoreElements()) {
            System.out.println(e.nextElement());
        }*/
        
        Map<String, String[]> map= requset.getParameterMap();
        for (Entry<String,String[]> entry:map.entrySet()) {
            System.out.println("参数名字:"+entry.getKey());
            
            System.out.print("参数的值:  ");
            for (String value:entry.getValue()) {
                System.out.println(value);
            }
        }
    }
}

 获取表单数据1

package com.zx.web.servlet.lesson02;

import java.io.IOException;
import java.util.Arrays;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Lesson02Servlet")
public class Lesson02Servlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        String gender=req.getParameter("gender");
        String remark=req.getParameter("remark");
        String[] hobbies = req.getParameterValues("hobby");
        
        System.out.println(username);
        System.out.println(password);
        System.out.println(gender);
        System.out.println(remark);
        System.out.println(Arrays.toString(hobbies));
    }
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<!--  表单的请求有get/post两种方式 ,
默认是get请求,如果是这样的话,在后台Servlet要写doGet方法
如果是post请求,后台要写post方法
-->
<form action="/day10Web/Lesson02Servlet">
    用户名:<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>    
    爱好:
    <input type="checkbox" name="hobby" value="学习">学习
    <input type="checkbox" name="hobby" value="赚钱">赚钱
    <input type="checkbox" name="hobby" value="游戏">游戏
    <input type="checkbox" name="hobby" value="玩耍">玩耍<br>
    备注:
    <textarea rows="5" cols="50" name="remark"></textarea><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

post请求时,中文会乱码,解决方法setCharacterEncoding,只针对post有效

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //post请求时,中文会乱码,解决方法
        req.setCharacterEncoding("UTF-8");//只针对post 请求
        
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        String gender=req.getParameter("gender");
        String remark=req.getParameter("remark");
        String[] hobbies = req.getParameterValues("hobby");
        
        System.out.println(username);
        System.out.println(password);
        System.out.println(gender);
        System.out.println(remark);
        System.out.println(Arrays.toString(hobbies));
    }

get和post请求的区别:

  • get请求是把请求参数放在url?后面进行拼接,
  • post请求在url中是看不到参数
  • post请求比较安全点

getInputStream【获取不到参数】-----针对post请求有效

使用InputStream读取数据时,发现中文变成百分号形式

post请求会对中文进行URL编码【中文变成百分号形式】

【url解码】:百分号形式变成中文

 

反射:当一个字节码文件加载到内存的时候,jvm会对该字节码j进行解剖,然后会创建y一个对象的class对象,把字节码文件的信息全部存储到该Class对象中,我们只要获取到Class对象,就可以使用很多操作

获取class对象方式一:Class.forName("包名.类名")

获取Class对象方式二:通过类名获取  类名.Class

获取Class对象方式三:通过对象获取  new 类名().getClass();

在反射中,如果想要获取到私有的东西,需要在get上加Declared即可

invoke  执行方法,第一个参数:执行的对象,第二个参数:方法需要的参数

 

获取表单二:

package com.zx.web.servlet.lesson04;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.zx.web.model.User;

@WebServlet("/Lesson04Servlet")
public class Lesson04Servlet extends HttpServlet{
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        req.setCharacterEncoding("UTF-8");
        User user=new User();
        try {
            BeanUtils.populate(user, req.getParameterMap());
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println(user);
    }
}

重定向:需要添加一个项目路径=上下文路径

 forward:假设是Servlet1转发给Servlet2,只有2的数据可以响应给客户端(浏览器)

include:也是请求转发,假设是Servlet1转发给Servlet2,1和2的数据都可以响应给客户端(浏览器)

转发地址栏不变,重定向地址栏改变

 

post请求有请求体,get请求没有请求体,因为参数在url后面

maxAge:cookie的缓存时间。默认是-1,默认存在浏览器的缓存中。单位是秒

  • 负数:表示cookie的数据存在浏览器缓存中
  • 0:表示删除cookie
  • 正数:缓存在持久化磁盘上的时间
package com.zx.web.servlet.lesson09;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.zx.web.model.User;

@WebServlet("/Lesson09Servlet")
public class Lesson09Servlet extends HttpServlet{
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //Cookie应用场景:记录上次访问时间
        //设置响应时乱码的问题
        resp.setHeader("content-type", "text/html;charset=utf-8");
        //获取请求头的Cookie
        Cookie[] cks=req.getCookies();
        if (cks!=null) {
            for(Cookie c:cks) {
                System.out.println(c.getName()+":"+c.getValue());
                resp.getWriter().write("上次访问的时间:"+c.getValue());
            }
        }
        
        //1.创建一个Cookie对象
        Cookie cookie=new Cookie("lastAccessTime", System.currentTimeMillis()+"");
        
        //2.设置cookie的存活时间【单位是秒】
        cookie.setMaxAge(60*20);
        
        //3.把Cookie返回给客户端【通过响应头传给客户端】
        resp.addCookie(cookie);
    }
}

 

Cookie细节

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
  • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  • 在setMAxAge(0)后还要加上response》addCookie(c)的,要响应回去,才能生效

记住用户名详解

 Servlet返回给客户端的数据可以是html标签数据,也就是可以write(“<a></a>”)

常识:从客户端/浏览器获取的所有数据都是字符串类型

查看书的浏览记录

posted on 2019-08-20 20:37  丨你微笑时好美丶  阅读(151)  评论(0编辑  收藏  举报