小言_互联网的博客

Java Web程序设计——请求和响应(三)

327人阅读  评论(0)

Java Web程序设计——请求和响应(三)

思维导图:

HttpServletRequest应用

获取请求参数
  • 根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值);
  • 根据name属性值,获取用户选择的值:String[] value = getParameterValues(name属性对应的值);
  • 没有参数,获取所有值:Map<String,String[]> map = getParameterMap();

例:

package chapter.request;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;


/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 根据name属性值,获取用户输入的值
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		// 根据name属性值,获取用户选择的值
		// String[] hobbys = request.getParameterValues("hobby");
		// response.getWriter().println("username:"+username+"<br/>");
		// response.getWriter().println("password:"+password+"<br/>");
		// response.getWriter().println("hobby:"+Arrays.toString(hobbys));
		// 没有参数,获取所有值
		Map<String, String[]>  map = request.getParameterMap();
		//遍历map
		Set<String> set = map.keySet();
		for(String key:set) {
			String[] value = map.get(key);
			System.out.println("name属性的值:"+key+" "+Arrays.toString(value));
			}
		}
	

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

form.html

用浏览器打开,可看到


解决请求参数的中文乱码问题

中文乱码处理分两种情况:

  • 处理get方式提交的中文乱码,使用的String的构造方法解决的中文乱码:new String(字节数组,编码格式);
  • 处理post方式提交的中文乱码,post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文处理方法,把request缓冲区的编码给设置成支持中文的码表格式

例:

package chapter.request;

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;

/**
 * Servlet implementation class RequestParamServlet
 */
public class RequestParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.获取用户名
		response.setContentType("text/html;charset=utf-8");
		String value = request.getParameter("username");
		String newvalue = new String(value.getBytes("ISO8859-1"), "utf-8");
		response.getWriter().print("处理后的值:" + newvalue);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.获取用户输入的值
		// 处理请求中文的乱码问题
		request.setCharacterEncoding("utf-8");
		String value = request.getParameter("username");
		System.out.println(value);
		// 处理响应中文乱码问题
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print(value);
	}

}

form.html

通过Request对象传递数据
  • 什么是域对象:在一定的范围内,可以存值和取值
  • request域对象:在一次请求中,可以存值和取值
  • 存值:setAttriute(String key,object obj);
  • 取值:Object obj = getAttribute(String key);
  • 移除:removeAttribute(String key);

RequestDispatcher对象的应用

RequestDispatcher接口
  • 在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向方法来实现,也可以RequestDispatcher转发对象的forward方法来实现
  • 得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher(“另一个资源的路径”);

常用方法

  • 实现请求转发:forwardObj.forward(request,response);
  • 实现请求包含:forwardObj.include(request,response);
请求转发

请求转发原理图:

例:
RequestForwardServlet

package chapter.request;

import java.io.IOException;

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

/**
 * Servlet implementation class RequestForwardServlet
 */
public class RequestForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.获取转发对象,转发到resultservlet
		RequestDispatcher rd = request.getRequestDispatcher("/result");
		// 2.调用转发方法,实现转发效果
		request.setAttribute("Company", "it----");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

RequestResultServlet

package chapter.request;

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

/**
 * Servlet implementation class RequestResultServlet
 */
public class RequestResultServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 处理响应中文的乱码问题
		response.setContentType("text/html;charset=utf-8");
		Object obj = request.getAttribute("Company");
		String name = (String) obj;
		response.getWriter().print("公司名称:" + name);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

注:请求转发:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。转发路径:转发动作是在服务器内部实现的,所以转发路径不用携带项目名称。
请求重定向:发送了两次请求,响应两次,不能喝request域对象配合使用。重定向路径:重定向动作实在浏览器端执行的,所以路径需要携带项目名称。

请求包含

请求包含原理图:

例:
RequestIncludingServlet

package chapter.request;

import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * 这是一个包含的Servlet,需要去包含其他web资源
 */
public class RequestIncludingServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/heml;charset=utf-8");
		// 1.获取转发对象
		RequestDispatcher rd = request.getRequestDispatcher("/included?p=abc");
		// 2.请求包含动作
		PrintWriter out = response.getWriter();
		out.print("including  before----");
		// 3.去包含includedServlet
		rd.include(request, response);
		out.print("including after-----");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

RequestIncludedServlet

package chapter.request;

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;

/**
 * 被包含的Servlet
 */
public class RequestIncludedServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.获取输出字符流对象
		PrintWriter out = response.getWriter();
		// 2.输入一段中文
		out.print("中国" + "<br/>");
		out.print("request URI" + request.getRequestURI()+"<br/>");
		// 3.获取请求路径后面拼接的参数
		out.print("request URI after param" + request.getQueryString()+"<br/>");
		// 4.获取请求的参数
		out.print("getParameter" + request.getParameter("p")+"<br/>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

注:请求包含:发送一次请求,请求包含是有服务器完成。请求包含路径:在服务器内部完成的,路径不需要携带项目名称。


转载:https://blog.csdn.net/DTRblank/article/details/105452338
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场