• JavaWeb之Servlet(3)


    Servlet(3)

    HttpServletRequest

    该类的对象封装了所以客户端提交过来的数据

    获取所有请求头数据

    public java.util.Enumeration<E> getHeaderNames()
    返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。 
    

    实例

    	Enumeration<String> heards = request.getHeaderNames();
    		while (heards.hasMoreElements()) {
    			String heard = (String) heards.nextElement();
    			String value = request.getHeader(heard);
    			System.out.println(heard + "=" + value);
    		}
    

    输出

    accept=image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
    referer=http://localhost:8080/HttpservletrequestDemo/login.html
    accept-language=zh-CN
    ua-cpu=AMD64
    accept-encoding=gzip, deflate
    user-agent=Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko
    host=localhost:8080
    connection=Keep-Alive
    

    获取客户端提交过来的数据

    1.通过对应name得到值

    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println(username + "==" +password);
    

    2.通过request.getParameterMap()得到一个所有数据的map集合,再从中提取数据

    		Map<String, String[]> map = request.getParameterMap();
    		Set<String> keySet = map.keySet();
    		System.out.println(keySet.size());
    		Iterator<String> it = keySet.iterator();
    		while (it.hasNext()) {
    			String key = (String) it.next();
    			String[] values = map.get(key);
    			System.out.println(key);
    			for(int i =0;i<values.length;i++) {
    				System.out.println(key + "=" + values[i]);
    			}
    			
    		}
    

    请求中中文乱码问题

    即由客户端(浏览器)提交给服务器端的数据,如果带有中文则会出现乱码问题。可通过以下方法解决

    对于get请求

    1.代码转码

    get请求过来的数据,会拼接到url地址栏,所以在url地址栏上就已经经过编码了,所以我们取到的就是乱码,tomcat收到了这批数据。而getParameter 默认使用ISO-8859-1去解码。

    解决方法:先让文字回到ISO-8859-1对应的字节数组 , 然后再按utf-8组拼字符串

    String username = request.getParameter("username");
    String password = request.getParameter("password");
    username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
    System.out.println("userName="+username+"==password="+password);
    
    2.直接在tomcat里面做配置,以后get请求过来的数据永远都是用UTF-8编码。

    可以在tomcat里面做设置处理 conf/server.xml 加上URIEncoding=“utf-8”

    对于post请求

    对于post请求来说,该请求的所有数据都在 请求体中,所以直接设置请求体中的文字编码。

    request.setCharacterEncoding("utf-8");
    

    这行设置一定要写在getParameter之前。

    HttpServletResponse

    负责返回数据给客户端

    输出数据到页面
    	//以字符流的方式写数据	
    	//response.getWriter().write("<h1>hello response...</h1>");
    	
    	//以字节流的方式写数据 
    	response.getOutputStream().write("hello response2222...".getBytes());
    

    解决数据中的中文乱码问题

    以字符流输出

    解决方式:

    response.getWriter()

    	//1. 指定输出到客户端的时候,这些文字使用UTF-8编码
    	response.setCharacterEncoding("UTF-8");
    
    	response.getWriter().write("人间不值得...");
    
    	//2. 直接规定浏览器看这份数据的时候,使用什么编码来看。
    	response.setHeader("Content-Type", "text/html; charset=UTF-8");
    	
    	response.getWriter().write("人间不值得...");
    

    以字节流输出

    response.getOutputStream()

    1. 指定浏览器看这份数据使用的码表
    response.setHeader("Content-Type", "text/html;charset=UTF-8");	
    
    1. 指定输出的中文用的码表,也可以不指定因为String的getBytes()方法的默认编码格式为utf-8
    response.getOutputStream().write("人间不值得..".getBytes("UTF-8"));
    
    不管是字节流还是字符流,直接使用一行代码就可以了。
    response.setContentType("text/html;charset=UTF-8");
    

    然后在后面进行写入数据即可。

    实现简单的资源下载

    1.先写一个简单的index.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	让tomcat的默认servlet提供下载:<br>
    	<a href="download/aa.jpg" >aa.jpg</a><br>
    	<a href="download/bb.txt" >bb.txt</a><br>
    	<a href="download/cc.rar" >cc.rar</a><br>
    	
    	手动下载:<br>
    	<a href="t1?filename=aa.jpg" >aa.jpg</a><br>
    	<a href="t1?filename=bb.txt" >bb.txt</a><br>
    	<a href="t1?filename=cc.rar" >cc.rar</a><br>
    </body>
    </html>
    

    2.然后再写一个servlet实现浏览器下载

    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class t1
     */
    public class t1 extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //通过request.getParameter("filename")得到要下载文件名称
    		String filename = request.getParameter("filename");
    		System.out.println(filename);
            //设置头信息,实现在浏览器下载文件
    		response.setHeader("Content-Disposition", "attachment; filename="+filename);
            //getServletContext().getResourceAsStream("download/"+filename)得到文件的流对象
    		InputStream is = getServletContext().getResourceAsStream("download/"+filename);
    		ServletOutputStream os = response.getOutputStream();
    		int len=0;
    		byte[] b = new byte[1024];
            //实现数据的写入
    		while((len=is.read(b))!=-1) {
    			os.write(b,0,len);
    		}
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    实现中文名称文件下载

    针对浏览器类型,对文件名字做编码处理 Firefox (Base64) , IE、Chrome … 使用的是URLEncoder

    1.html页面编写,和上面区别不大

    <body>
    	让tomcat的默认servlet提供下载:<br>
    	<a href="download/aa.jpg" >aa.jpg</a><br>
    	<a href="download/bb.txt" >bb.txt</a><br>
    	<a href="download/cc.rar" >cc.rar</a><br>
    	
    	手动下载:<br>
    	<a href="t1?filename=aa.jpg" >aa.jpg</a><br>
    	<a href="t1?filename=bb.txt" >bb.txt</a><br>
    	<a href="t1?filename=cc.rar" >cc.rar</a><br>
    	<a href="t1?filename=图片.png" >黑马.png</a><br>
    </body>
    

    2.servlet代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
    		String name = request.getParameter("filename");
    		String filename = new String(name.getBytes("ISO-8859-1"),"utf-8");
    		System.out.println(filename);
        	//这一步获取流对象提到编码之前,因为想要下载中文名称文件,那么在设置请求头时文件名必须要针对浏览器类型,对文件名字做编码处理。而在处理后文件名就不能找到对应文件
    		InputStream is = getServletContext().getResourceAsStream("download/"+filename);
        	//对浏览器类型,对文件名字做编码处理,此处为针对chrome做的处理。
    		filename = URLEncoder.encode(filename,"UTF-8");
    		response.setHeader("Content-Disposition", "attachment; filename="+filename);
    		ServletOutputStream os = response.getOutputStream();
    		int len=0;
    		byte[] b = new byte[1024];
    		while((len=is.read(b))!=-1) {
    			os.write(b,0,len);
    		}
    	}
    

    请求转发和重定向

    之前的写法

    			response.setStatus(302);
    			response.setHeader("Location", "login_success.html");
    

    重定向

    //重定向写法: 重新定位方向 参数即跳转的位置
    response.sendRedirect("login_success.html");
    
    1. 地址上显示的是最后的那个资源的路径地址

    2. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。

    3. 可以跳转到任意路径。 不是自己的工程也可以跳。

    4. 效率稍微低一点, 执行两次请求。

    5. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。

    请求转发

    //请求转发的写法: 参数即跳转的位置
    request.getRequestDispatcher("login_success.html").forward(request, response);
    
    1. 地址上显示的是请求servlet的地址。 返回200 ok

    2. 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。

    3. 只能跳转自己项目的资源路径 。

    4. 效率上稍微高一点,因为只执行一次请求。

    5. 可以使用上一次的request对象。

  • 相关阅读:
    大端序与小端序
    中断分类
    PHP开发框架[国内框架]
    PHP开发框架[流行度排名]
    ecshop 后台分页功能
    Windows下phpStudy中的Apache无法启动的排查方法
    Windows里配置Apache2.2+PHP5.3+mod_fcgid运行高效的FastCGI模式
    Apache多虚拟主机多版本PHP(5.2+5.3+5.4)共存运行配置全过程
    让 Node.js 支持 ES6 的语法
    微信小程序请求wx.request数据,渲染到页面
  • 原文地址:https://www.cnblogs.com/wf614/p/11673841.html
Copyright © 2020-2023  润新知