JavaEE--HttpServletResponse和HttpServletRequest中常用方法

HttpServletResponse

  • PrintWriter getWriter()
  • void setContentType(String type)
  • 下面Servlet代码展示了当客户端请求对应的url-pattern时,接收文本,并确保其显示不乱码
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 ServletDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//tomcat规定服务器中默认的编码为ISO-8859-1,不支持中文
		
	/*	//告诉服务器应用使用UTF-8解析文本
		response.setCharacterEncoding("UTF-8");
		//告诉客户端要使用什么编码
		response.setHeader("content-type", "text/html;charset=UTF-8");*/
		
		//告诉服务器应用使用UTF-8解析文本,告诉客户端要使用什么编码
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();//得到一个字符输出流
		out.write("你好!");//向客户端响应文本内容
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • ServletOutputStream getOutputStream()
  • void setHeader(“content-disposition”, String value)
  • void setHeader(“content-type”, String value)
  • 下面Servlet代码展示了当客户端请求对应的url-pattern时,提示下载文件
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//通过路径得到一个输入流,该文件应当位于src目录下
		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);
		
        //设置文件名的编码
        if(request.getHeader("user-agent").toLowerCase().contains("msie")){
            filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式
        }else{
            filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");//火狐、Chrome浏览器
        }
		
		//告知客户端要下载文件
		response.setHeader("content-disposition", "attachment;filename="+filename);
		//response.setHeader("content-type", "image/jpeg");
		response.setContentType(this.getServletContext().getMimeType(filename));//根据文件名自动获得文件类型,可以替代上一句
		
		//执行输出操作
		int len = 1;
		byte[] b = new byte[1024];
		while((len=fis.read(b))!=-1){
			sos.write(b,0,len);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
  • 下面代码展示了如何实现验证码的效果
package servlet;

import cn.dsna.util.images.ValidateCode;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //告诉客户端不使用缓存,如果不写效果也不会有变化
        response.setHeader("pragma", "no-cache");
        response.setHeader("cache-control", "no-cache");
        response.setIntHeader("expires", 0);

        //该方法需要借助额外的jar包:WEB-INF/lib/ValidateCode.jar
        ValidateCode vc = new ValidateCode(110, 25, 4, 9);
        vc.write(response.getOutputStream());
        //下面的方法是使用画笔自己画一个验证码
//        test1(response);
    }

    private void test1(HttpServletResponse response) throws IOException {
        int width = 110;
        int height = 25;
        //在内存中创建一个图像对象
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //创建一个画笔
        Graphics g = img.getGraphics();

        //给图片添加背景色
        g.setColor(Color.PINK);//设置一个颜色
        g.fillRect(1, 1, width-2, height-2);//填充颜色

        //给边框一个色
        g.setColor(Color.RED);
        g.drawRect(0, 0, width-1, height-1);//设置边框的显示坐标

        //设置文本样式
        g.setColor(Color.BLUE);
        g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15));

        //给图片添加文本
        Random rand = new Random();
        int position = 20;
        for (int i = 0; i < 4; i++) {
            g.drawString(rand.nextInt(10)+"", position, 20);//给图片填充文本
            position+=20;
        }

        //添加9条干扰线
        for (int i = 0; i < 9; i++) {
            g.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height));
        }
        //将图片对象以流的方式输出的客户端
        ImageIO.write(img, "jpg", response.getOutputStream());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 单纯上面的代码只是实现了生成验证码的效果,将其加到HTML网页当中
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
        //通过
        function changeCode(){
            //得到图片元素
            var img = document.getElementsByTagName("img")[0];
            img.src = "/TestWeb/demo3?time="+new Date().getTime();
        }
    </script>
</head>
<body>
<form action="#" method="post">
    用户名:<input type="text" name="userName"/><br>
    密码:<input type="password" name="pwd"/><br>
    验证码:<input type="text" name="code"/>
    <!--图片中的src属性会再次发起请求,所以能够得到验证码图片-->
    <img src="/TestWeb/demo3" onclick="changeCode()"/><a href="javascript:changeCode()" >看不清换一张</a><br>
    <input type="submit" value="登录"/><br>
</form>
</body>
</html>
  • void setHeader(“refresh”, String value)
  • 下面代码实现网页的跳转功能
package servlet;

import java.io.IOException;

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

public class ServletDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");

        response.getWriter().write("注册成功!3秒钟跳到主页");
        //设置3秒钟跳转,这里需要写另外一个Servlet,用来作为跳转的响应
        response.setHeader("refresh", "3;url=/TestWeb/homePage");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

  • 请求重定向
//告诉客户端要重新定向新的资源
response.setStatus(302);
//告诉浏览器要去访问哪个URL
response.setHeader("location", "/TestWeb/anotherPage");
		
//请求重定向,下面这句话等价于上面两句话
response.sendRedirect("/TestWeb/anotherPage");

HttpServletRequest

  • String getMethod()
  • StringBuffer getRequestURL()
  • String getRequestURI()
  • String getContextPath()
  • String getQueryString()
  • 以上是一些请求消息行方面的方法
package servlet;

import java.io.IOException;

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

public class ServletDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//		getMethod(); 获得请求方式
//		***getRequestURL();返回客户端发出请求时的完整URL。
//		***getRequestURI(); 返回请求行中的资源名部分。
//		*****getContextPath(); 当前应用的虚拟目录
//		getQueryString() ; 返回请求行中的参数部分。

        System.out.println(request.getMethod());
        System.out.println(request.getRequestURL());
        System.out.println(request.getRequestURI());
        System.out.println(request.getContextPath());
        System.out.println(request.getQueryString());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
  • 输出内容如下:
GET
http://localhost:8080/TestWeb/demo
/TestWeb/demo
/TestWeb
name=haha
  • String getHeader(String name)根据消息头名字获取相应内容
  • Enumeration<String> getHeaderNames()获取所有消息头的名字
  • 以上是一些请求消息头方面的方法
package servlet;

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

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

public class ServletDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        test1(request);
//		test2(request);
    }

    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("你使用的是其它浏览器");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

  • 以下是请求消息体方面的方法
  • String getParameter(String name)根据表单中元素的名字获取其值
  • String[] getParameterValues(String name)根据表单中元素的名字获取其值(复选框)
  • Enumeration<String> getParameterNames()获取所有表单名字
  • Map<String, String[]> getParameterMap()获取所有表单与其值组成的Map集合
  • 以下代码实现了提交表单数据,并根据HttpServletRequest对象获取提交的内容
package servlet;

import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
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;

import entity.User;
import org.apache.commons.beanutils.BeanUtils;

public class ServletDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //告诉服务器要使用什么编码,注:浏览器使用的是什么编码传过来的就是什么编码
        request.setCharacterEncoding("UTF-8");//只能解决post方式的乱码

//        test1(request);
//        test2(request);
//        test3(request);//方法3将表单中的数据封装到对象当中
        test4(request);
    }

    private void test4(HttpServletRequest request) {
        try {
            User u = new User();
            System.out.println("封装数据前:"+u);
            //BeanUtils类的使用需要导入两个包:WEB-INF/lib/commons-beanutils-1.8.3.jar、WEB-INF/lib/commons-logging-1.1.1.jar
            BeanUtils.populate(u, request.getParameterMap());//需要两个参数,分别是需要将数据封装进入的u对象和待封装的数据(Map类型)

            System.out.println("封装数据后:"+u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    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();

                //创建一属性描述器,下面获取对应属性的get和set方法的方式利用了反射的原理
                PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
                //得到setter属性
                Method setter = pd.getWriteMethod();

                if(value.length==1){
                    setter.invoke(u, value[0]);//给对象u的某个成员变量赋值
                }else{
                    setter.invoke(u, (Object)value);//给对象u的hobby成员变量赋值,该成员变量为字符串数组类型
                }
            }

            System.out.println("封装数据后:"+u);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    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]);
            }
        }
    }

    private void test1(HttpServletRequest request) {
        //获取表单数据

        //根据表单中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");

        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);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 以上代码还需要用到用来注册的HTML文件,和用来封装表单提交数据的User类
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<form action="/TestWeb/demo" method="post">
    用户名:<input type="text" name="userName"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    性别:<input type="radio" name="sex" value="" checked="checked"/><input type="radio" name="sex" value=""/><br/>
    爱好 :
    <input type="checkbox" name="hobby" value="篮球"/>篮球
    <input type="checkbox" name="hobby" value="唱歌"/>唱歌
    <input type="checkbox" name="hobby" value="编码"/>编码
    <br/>
    所在城市:
    <select name="city">
        <option>------请选择------</option>
        <option value="bj">北京</option>
        <option value="sh">上海</option>
        <option value="gz">广州</option>
    </select>
    <br/>

    <input type="submit" value="注册"/>
</form>
</body>
</html>
package entity;

import java.util.Arrays;

//在实体类中的字段要与表单中的name名一致
public class User {
    private String userName;
    private String pwd;
    private String sex;
    private String[] hobby;
    private String city;


    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Override
    public String toString() {
        return "User [userName=" + userName + ", pwd=" + pwd + ", sex=" + sex
                + ", hobby=" + Arrays.toString(hobby) + ", city=" + city + "]";
    }
}
  • 操作与非表单相关的数据相关的方法。与ServletContext相类似,HttpServletRequest也维护了一个Map集合;可以向其中添加和取出键值对,可以用在请求转发当中操作非标单数据。
void setAttribute(String name, Object o)
Object getAttribute(String name)
  • 与请求转发相关的方法
//path表示要转发的地址,这里的地址相比于请求重定向要少一个项目名称
RequestDispatcher getRequestDispatcher(String path)
//该方法不是HttpServletRequest类中的方法,而是RequestDispatcher中的。一般这两个方法连用进行请求转发。
void forward(ServletRequest request, ServletResponse response)
  • 请求转发和请求重定向的区别:
    • 请求转发只能在本项目内转发,不能访问其他应用
    • 而请求重定向则可以跳转其他应用
    • 请求转发可以转发数据,而请求重定向则不能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值