Loading

JavaServlet doGet和doPost的区别和用法

一,区别

在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个是get。可在

中的method属性中指定提交的方式。如:<form action="inputForm"method="get">,如果不指定method属性,则会默认该属性为”get”方式。

Get和post都能够提交数据,那么他们有什么不同呢?

不同点一:

通过get方式提交的数据有大小的限制,通常在1024字节左右。也就是说如果提交的数据很大,用get方法就可需要小心;而post方式没有数据大小的限制,理论上传送多少数据都可以。

不同点二:

通过get传递数据,实际上是将传递的数据按照”key,value”的方式跟在URL的后面来达到传送的目的的;而post传递数据是通过http请求的附件进行的,在URL中并没有明文显示。

不同点三:

通过Get方式提交的数据安全性不高,而Post方式的更加安全~

二,使用

下面举个例子说明:

1.post提交--doPost方法

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
      <h3>登录</h3>
      <hr>
      <form action="LoginServlet" method="post">
                用户名:<input type="text" name="username"/><br>
                 密码:<input type="password" name="password"/><br>
              <input type="submit" />
      </form>
 
</body>
</html>

LoginServlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		//向服务器发送请求获取到参数
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		System.out.println(username+"--"+password);
		
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		Writer out=response.getWriter();
		out.write("用户名:"+username);
		out.write("密码:"+password);
		out.flush();
		out.close();	
	}

效果图:
image
这就是Post方式提交和doPost方法使用的效果,是不是更安全呢~~~

2.get方式--doGet方法

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
      <h3>登录</h3>
      <hr>
      <form action="LoginServlet" method="get">
                用户名:<input type="text" name="username"/><br>
                 密码:<input type="password" name="password"/><br>
              <input type="submit" />
      </form>
 
</body>
</html>

LoginServlet:

@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		//向服务器发送请求获取到参数
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		System.out.println(username+"--"+password);
		
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		Writer out=response.getWriter();
		out.write("用户名:"+username);
		out.write("密码:"+password);
		out.flush();
		out.close();
	}

效果图:
image
看这个效果图是不是觉得用户名和密码都暴露了呢~~这样很不安全~

3.也可以post方式提交,然后在doGet方式写逻辑代码,不过要在doPost方法中调用doGet方法,同样get方式也是一样的道理

Servlet的工作过程和原理

Servlet工作过程中,涉及到了客户端(浏览器)、Servlet容器、Servlet应用三种角色。大致过程如下所示:

首先,由客户端发起请求。

然后,Servlet容器接收到客户端的请求,解析请求协议和数据,如果servlet程序还没有被加载,就会执行加载过程并调用service()方法,否则直接调用service()方法。

其中,加载Servlet程序的过程:根据Servlet容器与Servlet程序间的契约,当有请求过来时,如果Servlet程序还没有被载入Servlet容器中,这个时候Servlet容器就会通过调用init()方法将Servlet类载入内存,并产生Servlet实例。在调用init()方法的时候,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。该过程只会被执行一次,即在一个应用程序中,每类Servlet程序只能有一个实例。其中,在ServletConfig对象中还隐藏一个ServletContext实例对象,这个ServletContext实例对象就表示了Servlet程序在容器中的上下文环境。

而,service()方法执行的过程:首先由Servlet容器解析请求参数并封装成一个ServletRequest和ServletResponse对象。其中,ServletRequest中封装了当前的Http请求,开发者可以操作ServletRequest对象获取用户的请求数据;ServletResponse封装了当前用户的Http响应,开发者可以操作ServletResponse对象把响应内容发回给用户。Servlet容器把ServletRequest和ServletResponse作为参数传递给了service()方法,通过执行service()方法,实现响应的逻辑,并通过ServletResponse对象返回内容到客户端。

最后,如果关闭Servlet容器时,这个时候,Servlet容器就会根据契约,调用destroy()方法,该方法一般都用来编写一些释放资源的逻辑。

Servlet的工作过程涉及到的实例

根据前面分析的Servlet的工作过程,我们可以了解到,在这个过程中用到了以下几类对象:

ServletRequest 封装了当前的Http请求,开发者可以操作ServletRequest对象获取用户的请求数据
ServletResponse 封装了当前用户的Http响应,开发者可以操作ServletResponse对象把响应内容发回给用户
ServletConfig 封装了初始化Serlvet程序需要的信息,同时还保存了一个ServletContext实例的引用。
ServletContext 封装了Servlet程序在Servlet容器中的上下文环境

原文链接:https://blog.csdn.net/qq_33642117/article/details/51850417

posted @ 2022-02-25 17:45  Cn_FallTime  阅读(611)  评论(0)    收藏  举报