Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest

HttpServletResponse

1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码

1
2
response.setHeader("content-type", "text/html;charset=UTF-8"); 
response.setContentType("text/html; charset=UTF-8");

2.getWriter

1
2
PrintWriter out = response.getWriter();//得到一个字符输出流
out.write("你好!");//向客户端响应文本内容

3.getOutputStream

1
2
3
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream sos = response.getOutputStream();
sos.write("你好123".getBytes("UTF-8"));//getBytes默认编码为本地编码(即:gbk)

4.下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //通过路径得到一个输入流
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg");
        FileInputStream fis = new FileInputStream(path);
        //创建字节输出流
        ServletOutputStream sos = response.getOutputStream();
        //得到要下载的文件名
        String filename = path.substring(path.lastIndexOf("\\")+1);
        //设置文件名的编码
        filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式
        //告知客户端要下载文件
        response.setHeader("content-disposition", "attachment;filename="+filename);
        response.setHeader("content-type", "image/jpeg");
        //执行输出操作
        int len = 1;
        byte[] b = new byte[1024];
        while((len=fis.read(b))!=-1){
            sos.write(b,0,len);
        }
        sos.close();
        fis.close();
    }

5.告诉客户端不使用缓存

1
2
3
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setIntHeader("expires", 0);

6.跳转

1
2
3
4
5
6
7
8
9
10
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        /*response.setIntHeader("refresh", 1);//设置1秒钟刷新一次
        Random r = new Random();
        response.getWriter().write(r.nextInt()+"");*/
        response.getWriter().write("注册成功!3秒钟跳到主页");
        //设置3秒钟跳转
        response.setHeader("refresh", "3;url=/day09_reques_response/demo6");
    }

7.重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("A:我要借钱!");
        System.out.println("B:我不有,但是我可以告诉你谁有");
        /*//告诉客户端要重新定向新的资源
        response.setStatus(302);
        //告诉浏览器要去访问哪个URL
        response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/
         
        //请求重定向
        response.sendRedirect("/day09_reques_response/demo8");
         
        System.out.println("A: 我去了");
         
    }

8.response细节  

getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。

Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态

行和各响应头组合后输出到客户端。

Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关

闭该输出流对象。

HttpServletRequest

1.request常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
获得客户机请求头
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据)
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法  //做框架用,非常实用
getInputStream

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    //test1(request);
            //test2(request);
    //获得相关name的消息头
    Enumeration headers = request.getHeaders("accept-language");
    while(headers.hasMoreElements()){
        String e = (String) headers.nextElement();
        System.out.println(e+":"+request.getHeader(e));
    }
}
 
private void test2(HttpServletRequest request) {
    //获得所有请求消息头的name
    Enumeration names = request.getHeaderNames();
    while(names.hasMoreElements()){
        String e = (String) names.nextElement();
        System.out.println(e+":"+request.getHeader(e));
    }
}
 
private void test1(HttpServletRequest request) {
    //获得请求消息头的信息
    String header = request.getHeader("User-Agent");
    System.out.println(header);
    if(header.toLowerCase().contains("msie")){
        System.out.println("你使用的是IE浏览器");
    }else if(header.toLowerCase().contains("firefox")){
        System.out.println("你使用的是火狐浏览器");
    }else if(header.toLowerCase().contains("chrome")){
        System.out.println("你使用的是谷歌浏览器");
    }else{
        System.out.println("你使用的是其它浏览器");
    }
}

2.获得参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void test1(HttpServletRequest request) throws UnsupportedEncodingException {
        //获取表单数据
        //根据表单中name属性的名,获取value属性的值方法
        String userName = request.getParameter("userName");
        String pwd = request.getParameter("pwd");
        String sex = request.getParameter("sex");
        String[] hobbys = request.getParameterValues("hobby");
        String city = request.getParameter("city");
        userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");
        System.out.println(userName);
        System.out.println(pwd);
        System.out.println(sex);
         
        for (int i = 0;hobbys!=null && i < hobbys.length; i++) {
            System.out.print(hobbys[i]+"\t");
        }
        System.out.println();
        System.out.println(city);
    }

 

1
2
3
4
5
6
7
8
9
10
11
private void test2(HttpServletRequest request) {
        //获取所有的表单name的名子
        Enumeration names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = (String) names.nextElement();//得到每一个name名
            String[] values = request.getParameterValues(name);//根据name名,得到value值
            for (int i = 0;values!=null && i < values.length; i++) {
                System.out.println(name+"\t"+values[i]);
            }
        }
    }

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void test3(HttpServletRequest request) {
        try {
            User u = new User();
            System.out.println("封装数据前:"+u);
            //获取表单数据
            Map<String,String[]> map = request.getParameterMap();
            for (Map.Entry<String, String[]> m : map.entrySet()) {
                String name = m.getKey();
                String[] value = m.getValue();
                //创建一属性描述器
                PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
                //得到setter属性
                Method setter = pd.getWriteMethod();
                if(value.length==1){
                    setter.invoke(u, value[0]);//给一个值的变量赋值
                }else{
                    setter.invoke(u, (Object)value);//相关于给复选框赋值
                }
            }
            System.out.println("封装数据后:"+u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

依赖包commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar

1
2
3
4
5
6
7
8
9
10
private void test4(HttpServletRequest request) {
        try {
            User u = new User();
            System.out.println("封装数据前:"+u);
            BeanUtils.populate(u, request.getParameterMap());
            System.out.println("封装数据后:"+u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.请求转发(请求一次)

1
request.getRequestDispatcher("/demo6").include(request, response);

写入需要传递的值

1
2
//将非表单的数据添加到request的域中
request.setAttribute("s", str);

获取传过来的值

1
2
3
4
//将request对象中的移除
//request.removeAttribute("s");
//从request对象中获取s的值
String s = (String) request.getAttribute("s");

4.重定向(请求两次)

1
2
3
4
5
6
7
8
//将请求转发到demo6中
//request.getRequestDispatcher("/servlet/demo6").forward(request, response);
//注:请求转发不能跳转到其它应用
//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
//使用重定向
//response.sendRedirect(request.getContextPath()+"/servlet/demo6");
//可以跳转到其它应用
//response.sendRedirect("http://www.baidu.com");

5.请求包含

1
2
//请求包含
request.getRequestDispatcher("/demo6").include(request, response);

6.解决乱码

1
2
request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码
userName = new String(userName.getBytes("iso-8859-1"),"UTF-8");//解决get乱码

  

posted @   ~沐风  阅读(316)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示