个人java学习路线-模板方法设计模式之HttpServlet

个人java学习路线-模板方法设计模式之HttpServlet

get和post

先来看看由get和post引出的问题

前端和后台需要的请求方式不一致会报错
1.get和post的区别和联系

- GET请求在请求行上提交数据,格式:url?name=value&name=value....
		这种提交方式最终提交的数据会显示到浏览器地址栏上
		
- POST请求在请求体中提交数据,相对安全,提交格式:name=value&name=value....
这种提交方式最终不会在浏览器的地址栏上

- POST请求在请求体中提交数据,所以POST请求提交的数据没有长度的限制【POST可以提交大数据】

- GET请求在请求行上提交数据,所以GET请求提交的数据长度有限制

- GET请求只能提交字符串数据,POST请求可以提交任何类型的数据,包括视频...,所以文件上传必须使用POST请求提交

- GET请求最终的结果会被浏览器缓存收纳,而POST请求最终的结果不会被浏览器缓存。

2.那么我们该如何选择呢?

	- 有敏感数据,必须使用POST
	- 传送数据不是普通字符串,必须使用POST
	- 传送的数据非常多,使用POST
	- 这个请求为了修改服务器端资源,使用POST
	- GET请求多数情况下是从服务器中读取资源,这个读取的资源在短时间之内是不会发生变化的,所以GET请求的最终的结果浏览器缓存起来; 
	- POST请求是为了修改服务器端的资源,而每一次修改结果都是不同的,最终结果没有必要被浏览器缓存

3.如何取得get和post中的数据?以及如何保证前端和后台需要的请求方式一致呢?

获取请求的方式
	**HTTP的请求协议全部信息被自动封装到javax.servlet.http.HttpServletRequest对象中
	
	- 在HttpServletRequest接口类型中有一个方法叫做:String getMethod();可以获取请求方式
	
	- public interface javax.servlet.http.HttpServletRequest extends ServletRequest{}

为了保证前端和后台需要的请求方式一致我们需要在Servlet中做出类似如下判断(这里需要的是post请求)
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		String method=request.getMethod();
		//System.out.println(method);
		if("GET".equals(method)) {
			out.print("405-您应当发送POST请求");
			throw new RuntimeException("405-您应当发送POST请求");
		}
		out.print("正在登录");

可见如果每一个Servlet都要写这样的方法就会很繁琐,而且我们也不好判断需要的是get还是post
所以我们就要封装以上代码以及做出判断

封装代码

public class HttpServlet extends GenericServlet {
    
    
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    
    
		HttpServletRequest request=(HttpServletRequest)req;
		HttpServletResponse response=(HttpServletResponse)res;
		service(request,response);
	}
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		String method =request.getMethod();
		if("POST".equals(method)) {
    
    
			doPost(request,response);
		}else if("GET".equals(method)){
    
    
			doGet(request,response);
		}
	}
	private void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out =response.getWriter();
		out.print("405-您应当发送POST请求");
		throw new RuntimeException("405-您应当发送POST请求");
	}
	private void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out =response.getWriter();
		out.print("405-您应当发送GET请求");
		throw new RuntimeException("405-您应当发送GET请求");
	}
}

代码中有doGet和doPost两个方法,为什么这里两个方法全部都是报错的呢?
这里就是运用了模板方法设计模式
这里只需在子类继承HttpServlet时,选择性重写方法即可,比如子类需要post方法
那么自己就重写doPost方法即可

	模板方法设计的特点:
	doxxx
	doyyy
	dozzz..
	
模板方法设计属于:行为型设计模式。

模板方法设计模式主要作用:
	1.核心算法得到保护
	2.核心算法得到复用
	3.在不改变算法的前提之下,却可以重新定义算法步骤的具体实现

HttpServlet继承GenericServlet自然也是早就有的类,直接导入就好,这里只是模仿

猜你喜欢

转载自blog.csdn.net/youxizaixian123/article/details/119854052
今日推荐