-
2021-02-26 15:12:25
我是个java初学者突然需要看懂下面的程序我实在是看不懂请会的人帮忙一句句讲解一下看看我能不能懂一点拜托了谢谢protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponse...
我是个java初学者 突然需要看懂下面的程序 我实在是看不懂 请会的人帮忙 一句句讲解一下 看看我能不能懂一点 拜托了 谢谢
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("===doGet==");
try {
byte[] contentByte = null;
String respond_str = "";
ChgDateType chgDateType = new ChgDateType();
respond_str = chgDateType.responseAllWebInf("01"," 1=1");
contentByte = respond_str.getBytes();
response.setContentType("application/vnd.wap.mms-message");
ServletOutputStream outStream = response.getOutputStream();
outStream.write(contentByte);
outStream.flush();
outStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
processRequest(request, response);
}
大概解释一下每句话的意思就可以,尽量解释的清楚一些,谢谢。
展开
更多相关内容 -
【servlet】彻底解决doGet、doPost以及控制台中文乱码问题
2021-01-08 12:44:46我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。 思维导图: 1. 应答乱码处理(response输出页面时乱码) 1.1 ... -
Java doGet, doPost方法和文件上传实例代码
2020-09-01 07:53:06主要介绍了Java doGet, doPost方法和文件上传实例代码的相关资料,需要的朋友可以参考下 -
doGet、doPost、模拟post上传文件等http请求util
2018-10-08 11:54:33模拟http请求实现文件上传,模拟doGet、doPost请求,实现信息发送 -
13-Servlet访问流程以及doGet和doPost.pdf
2020-10-28 17:20:38Servlet访问流程以及doGet和doPost 能力目标 能叙述Servlet访问流程以及Servlet的生命周期 能描述init()、service()、destory()什么时候被调用的 能描述doGet()和doPost()内部访问流程 -
Tomcat源码分析之 doGet方法(一)
2021-03-16 21:46:44Servlet是JavaWeb开发中最常使用的一个接口,尤其是这个接口中的doGet()和doPost()方法。我们在做web开发的时候,经常会自定义一个Servlet如HelloServlet,并且让这个类继承HttpServelt,接着重写doGet()方法就可以...Servlet是JavaWeb开发中最常使用的一个接口,尤其是这个接口中的doGet()和doPost()方法。我们在做web开发的时候,经常会自定义一个Servlet如HelloServlet,并且让这个类继承HttpServelt,接着重写doGet()方法就可以快速实现我们自己的请求服务。
那么doGet()方法的背后到底发生了什么?有些同学可能会说这个问题很简单啊,就是HttpServlet做了一次封装会判断HTTP请求的类型,如果是get请求就调用doGet()方法,如果是post请求就调用doPost()方法。
我们想要的并非这种简单的回答,而是探究这背后的背后究竟发生了什么?
HelloServlet ->HttpServlet->ApplicationFilterChain -> WsFilter -> StandardWrapperValve ->StandardContextValve -> StandardHostValve -> StandardEngineValve ->CoyoteAdapter -> Http11Processor -> NioEndpoint -> ThreadPoolExecutor-> Worker -> TaskThread -> Thread -> Catalina ->Bootstrap.main()
这才是最终我们想要得到的答案,从doGet方法开始,逐步的探究它开始的地方,最终这个开始的地方在什么地方结束呢?答案无疑是Tomcat程序启动的入口main函数。只有完成了这样的一个历程,我们才能说我们彻底明白了doGet()方法,彻底明白了这背后到底发送了什么。
通过本系列博客的阅读,您将彻底的了解doGet()方法背后发生了什么,从源码的角度深入的理解Tomcat的实现机制,Tomcat中各核心组件是如何协同工作的,同时也会学习到WEB服务器设计思路。
1目标
本系列博客源码分析的目标是深入了解Tomcat中doGet方法的实现机制。本次源码分析的目标是了解Servlet。
2分析方法
首先编写测试代码,然后利用Intellij Idea的堆栈窗口、线程窗口以及单步调试功能,逐步的分析其实现思路。
前期准备工作如下:1)编写HelloServlet类。public classHelloServletextendsHttpServlet {
@Overrideprotected voiddoGet(HttpServletRequestreq, HttpServletResponse resp)throwsServletException, IOException {
resp.getWriter().write("hello");//断点位置
}
}2) web.xml中添加servlet配置。
helloServletHelloServlethelloServlet/hello
3)测试运行
浏览器地址栏输入:http://localhost:8080/hello最终页面显示结果:hello
4)进入调试分析阶段。
在HelloServlet的doGet()方法前加上断点,点击调试按钮,进入调试阶段,开始源码分析。
3分析流程
点击调试按钮,开始分析流程。
首先我们来看一下doGet()方法的执行堆栈信息。at HelloServlet.doGet(HelloServlet.java:17)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1368)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
从上面我们可以看到一共有25条堆栈信息,调用非常复杂,但这25条信息也并非是程序开始的地方,后面我们会带大家一起来寻找程序开始的地方。
我们要想搞明白doGet()方法背后发生了什么,其实就是要弄明白这些堆栈信息,所以目前我们看到的就有25条信息,后面将一步步的带大家来了解。
由于分析内容较多,我们将分几次博客来介绍,如果您对本系列博客感兴趣,欢迎关注微信公众号“算法与编程之美”,及时了解更多信息。
首先对这些堆栈信息做一些简单的介绍,
HelloServlet.doGet(HelloServlet.java:17)
表示HelloServlet 类的 doGet()方法,代码行数为17.
3.1 HelloServlet.doGet
@Overrideprotected voiddoGet(HttpServletRequestreq, HttpServletResponse resp)throwsServletException, IOException {
resp.getWriter().write("hello"); //17
}
这里面的17行就是我们打断点的地方,也是我们用户编写程序开始的地方。功能很简单就是向HTTP响应中写入"hello"字符串。
3.2 javax.servlet.http.HttpServlet.service
2. at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
3. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
2和3我们打算一起来分析,因为他们都在HttpServlet里面。在具体分析源码之前,我们先介绍一点关于Servlet的基本知识。
在学习Servlet基础知识的时候,我们都知道,Servelt是一段服务器端的程序,专门用来处理来自客户端请求的,处理完成后返回一个响应。大多数情况下这个请求是Http请求,这个响应是Http响应,并且在Http响应中包含了HTML代码。
Servlet是一个接口,其定义如下:
public interfaceServlet {
public voidinit(ServletConfigconfig)throwsServletException;
publicServletConfiggetServletConfig();
public voidservice(ServletRequest req,ServletResponse res)throwsServletException,IOException;
publicString getServletInfo();
public voiddestroy();
}
这个接口定义非常简单,主要方法介绍如下:
init方法表示Tomcat服务器刚加载这个Servlet时执行的代码。
service方法表示这个Servlet在处理请求时执行的代码。
destroy方法表示当不再使用这个Servelt销毁时执行的代码。
所以我们看到Servlet是有生命周期的,刚开始诞生的时候调用init方法,期间服务请求时,调用Service方法,最后销毁时调用destroy方法。
这里面尤其需要注意的是service()方法的两个形参类型是ServeltRequest和ServletResponse。
由于我们在web.xml中配置了将访问路径为'/hello'的请求交给HelloServlet来处理,此外由HelloServlet的如下的继承关系:
- HelloServlet继承了HttpServlet
public classHelloServletextendsHttpServlet
- HttpServlet继承了GenericServlet
public abstract classHttpServletextendsGenericServlet
- GenericServlet实现了Servlet接口
public abstract classGenericServletimplementsServlet, ServletConfig,
java.io.Serializable
我们可以得出HelloServlet是一个符合JavaEE规范的Servlet,因此能够处理Http请求,按照上述介绍的理论,当Http请求'/hello'到达服务器时,将调用HelloServlet的service方法对其进行处理。
HelloServlet中并没有service方法,该方法位于其父类HttpServlet中,其定义如下所示:
public voidservice(ServletRequest req, ServletResponse res)throwsServletException,IOException {
HttpServletRequest request;
HttpServletResponse response;try{
request =(HttpServletRequest)req;
response =(HttpServletResponse)res;
}catch(ClassCastException var6) {throw newServletException("non-HTTP requestor response");
}this.service(request, response);
}
从上述代码可以看到,将ServletRequest强制转化为HttpServletRequest,将ServletResponse强制转化为HttpServletResponse,然后再交给另外一个service()方法处理。
为什么要做这种转化呢?为什么不直接处理ServletRequest和ServletResponse?
欢迎大家留言,说说您的看法。
做完这种类型转化后,交给另一个service方法处理。
protected voidservice(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {
String method = req.getMethod();if(method.equals(METHOD_GET)) {
//...doGet(req,resp);} else if(method.equals(METHOD_POST)) {
doPost(req, resp);
}else if(method.equals(METHOD_PUT)) {
//...
}
以上的代码大家应该都非常容易理解,首先获得Http请求方法的类型,然后根据不同的类型去调用不同的方法,如方法类型为get则调用doGet()方法。由于在子类HelloServlet实现了doGet()方法,因此最终执行的是上面我们写的代码。
通过§3.1和§3.2两节的分析我们知道,当一个请求达到Servlet的时候,首先会将这个请求转化为HttpServletRequest,这个响应转化为HttpServletResponse,然后得到Http请求的方法类型,最后根据不同的方法类型调用不同的方法来处理。
4总结
本文是《Tomcat源码分析之doGet方法》的第一篇文章,主要介绍了源码分析的目标以及主要任务有哪些,并对Servlet知识点做了非常细致的介绍,帮助大家更好的了解Servlet,以及为什么用户自定义的Servlet需要继承HttpServlet。
下一讲我们将介绍4、5、6、7、8,重点介绍ApplicationFilterChain的相关知识点,欢迎大家持续关注。
其他精彩文章:
-
java servlet中doGet()和doPost()方法的用法和区别
2021-02-12 20:47:44一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方式数据的传输载体是URL(提交方式能form...一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方式数据的传输载体是URL(提交方式能form,也能任意的URL链接),而POST是HTTP头键值对(只能以form方式提交)。通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了,例如在doGet方法中这样写
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
再把业务逻辑直接写在doPost方法中。servlet碰到doGet方法调用直接就会去调用doPost因为他们的参数都一样。而且doGet方法处理中文问题很困难,要写过滤器之类的。
以上from 百度知道 @權寶兒
在网上搜集了一些资料,把两方法的区别整理如下:
get和post是http协议的两种方法,另外还有head, delete等
这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是通过另外的流传递的,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。
在servlet开发中,以doGet()和doPost()分别处理get和post方法。
首先判断请求时是get还是post,如果是get就调用doGet(), 如果是post就调用doPost()。都会执行这个方法。
1.doGet
GET调用用于获取服务器信息,并将其做为响应返回给客户端。当经由Web浏览器或通过HTML、JSP直接访问Servlet的URL时,一般用GET调用。GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来一些问题,比如用户登录,表单里的用户名和密码需要发送到服务器端,若使用Get调用,就会在浏览器的URL中显示用户名和密码。
例:
jsp页代码:
………
………
servlet代码:
public class doGet_servlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);//汉字转码
PrintWriter out = response.getWriter();
out.println("The Parameter are :"+request.getParameter("name1"));
}
}
这样提交表单后,参数会自动添加到浏览器地址栏中,带来安全性问题。
2.doPost
它用于客户端把数据传送到服务器端,也会有副作用。但好处是可以隐藏传送给服务器的任何数据。Post适合发送大量的数据。
例:
jsp页代码:
………
………
servlet代码:
public class doPostt_servlet extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse esponse) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);//汉字转码
PrintWriter out = response.getWriter();
out.println("The Parameter are :"+request.getParameter("name2"));
}
}
3.可以把方法写在doGet()方法中,在doPost()方法中调用执行,这样,无论你提交的是post还是get方法都可以执行
例如:
jsp页代码:
………
………
servlet代码:
public class servlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
request.setCaracterEncoding(“gb2312”);//汉字转码
PrintWriter out = response.getWriter();
out.println("The Parameter are :"+request.getParameter("name1"));
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
this.goGet(request,response);//调用doGet()方法
}
}
另外,HttpServlet处理客户端请求方式还有doPut、doDelete、doTrace、doHead、doOptions,但使用的比较少。
1,生成方式
get方式有四种:1)直接在URL地址栏中输入URL。2)网页中的超链接。3)form中method为get。4)form中method为空时,默认是get提交。
post只知道有一种:form中method属性为post。
2、数据传送方式
get方式:表单数据存放在URL地址后面。所有get方式提交时HTTP中没有消息体。
post方式:表单数据存放在HTTP协议的消息体中以实体的方式传送到服务器。
3、服务器获取数据方式
GET方式:服务器采用request.QueryString来获取变量的值。
POST方式:服务器采用request.Form来获取数据。
4、传送的数据量
GET方式:数据量长度有限制,一般不超过2kb。因为是参数传递,且在地址栏中,故数据量有限制。
POST方式:适合大规模的数据传送。因为是以实体的方式传送的。
5、安全性
GET方式:安全性差。因为是直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息。所以安全性低。
POST方式:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的。
6、在用户刷新时
GET方式:不会有任何提示、
POST方式:会弹出提示框,问用户是否重新提交
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
Servlet的doGet/doPost 是在 javax.servlet.http.HttpServlet 中实现的
doGet:处理GET请求
doPost:处理POST请求
当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先判断该请求是GET 操作还是POST 操作。然后它调用下面的一个方法:doGet 或 doPost。如果请求是GET就调用doGet方法,如果请求是POST就调用doPost方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。
get只有一个流,参数附加在url后,地址行显示要传送的信息,大小个数有严格限制且只能是字符串,大小限制在1024KB。post的参数是通过另外的流传递的, 不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。
get通过URL提交的参数会显示在地址栏中,这在系统的安全方面可能带来问题;post提交的参数不会显示在地址栏中。这样post就可以提高get的安全性能,避免数据的泄露。
当form框里面的method为get时,执行doGet方法,使用get提交就必须在服务器端用doGet()方法接收;当form框里面的method为post时,执行doPost方法,使用post提交就必须在服务器端用doPost()方法接收。
在request请求里面,编码转换;get方法得到的内容每一个都要进行编码转换,而post方法则只要设置request.setCharacterEncoding("UTF-8")就可以,不要再从request得到的每个数据进行编码转换了。
1、安全
GET调用在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来问题,例如用户名和密码等
POST就可以在一定程度上解决此类问题
2、服务器接收方式
服务器随机接受GET方法的数据,一旦断电等原因,服务器也不知道信息是否发送完毕
而POST方法,服务器先接受数据信息的长度,然后再接受数据
3、form运行方式
当form框里面的method为get时,执行doGet方法
当form框里面的method为post时,执行doPost方法
4、容量限制
GET方法后面的信息量字节大小不要超过1.3K,而Post则没有限制
最后说明的是:
你可以用service()来实现,它包含了doget和dopost ;service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!
service()是在javax.servlet.Servlet接口中定义的, 在 javax.servlet.GenericServlet
中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子类.
所有可以这样理解, 其实所有的请求均首先由 service() 进行处理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要做的事情就是判断请求类型是 Get 还是 Post, 然后调用对应的 doGet/doPost 执行.
-
1.2(学习笔记)Servlet基础(doGet、doPost、生命周期、页面跳转)
2021-03-13 22:11:50一、doGet()与doPost()我们在TestServlet类中重写doGet()、doPost()、service()。importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;...一、doGet()与doPost()
我们在TestServlet类中重写doGet()、doPost()、service()。
importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestServlet extendsHttpServlet{publicTestServlet() {};
@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("doPost");
}
@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("sevice");
}
@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("doGet");
}
}
同时在WebContent创建一个Test.html文件
Insert title hereusername:pwd:
我们点击提交按钮会发现控制台输出sevice,说明调用的service()方法。
我们看下API中关于service()方法的介绍:接收标准的HTTP请求,并将其
发送到此类中定义的doXXX方法,不需要重写这个方法。
也就是说请求会先传递到service()中,在由其发送给doXXX方法。
只要service()被重写了,请求就会一直传递给service().
我们将service()方法注释
再来提交信息,看下会执行那个方法。
可以看4到此时执行的是doGet,这时因为在form中设置了method=“get”,
代表提交方式为get,请求先提交给service(),然后再由其转发给对应的doXXX方法。
由于设置了提交方式为get,所以是执行给doGet()。
doGet调用时我会发现在地址栏显示传递给servlet的数据:
这样是不安全的,而且采用get方式传递的数据有大小限制,后面跟随的信息字节不能超过1.3k。
我们来看下API中对doGet()的叙述:
由服务器调用,以允许servlet处理get请求,重写此方法时,读取请求数据、
写入响应头、获取响应的写入器或输出流对象,最后写入响应数据。
如果将"get"设置为“post”,则会执行doPost()方法。
采用post传递数据不会在URL上显示出来,有一定的安全性。
而且post可以传递的数据理论上是无限大的。
二、Servlet生命周期
2.1实例化一个Servlet
创建一个servlet实例
2..2调用Init()
调用一次。
2.3调用service方法(doGet、doPost)
被调用多次,每次请求调用。
2.4调用destory方法。
调用一次销毁Servlet
我们创建一个TestServlet类,继承HTTPServlet。
重写里面的intI()、doget() doPost() destroy() 并添加一个无参构造器。
HTML采用上述代码。
importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestServlet extendsHttpServlet{publicTestServlet() {
System.out.println("TestServlet");
};
@Overridepublic void init() throwsServletException {
System.out.println("Init");
}
@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("doPost");
}
@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
System.out.println("doGet");
}
@Overridepublic voiddestroy() {
System.out.println("destroy");
}
}
然后将项目添加到Tomcat上。
点击提交我们会发现控制台中打印的信息:
一开始首先实例化一个Servlet,然后初始化,我们提交数据时调用对应的servlet方法(doGet或doPost)。
我们继续刷新会发现控制台继续打印doGet,但实例化和初始化只调用一次,有请求是调用则调用doGet方法。
最后我们将Tomcat停止运行,会发现控制会输出destroy,此时servlet被销毁了。
三、获取初始化参数
首先在web.xml文件中配置初始化参数。
初始化参数分为:局部初始化,只有当前Servlet可以获取其参数。
全局初始化:所有Servlet都可以获取其参数。
我们首先要在web.xml中设置初始参数信息。
context-param
localhost:3306/mydatabase
firstServlet
com.servlet.firstServlet.TestServlet
initParam
initParam
firstServlet
/TestServlet.html
设置好了参数,我们来获取参数。
importjava.io.IOException;importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestParam extendsHttpServlet{private String initParam = null;private String contextParam = null;
@Overridepublic void init() throwsServletException {
//获取初始化参数,和全局参数this.initParam = this.getInitParameter("initParam");this.contextParam = this.getServletContext().getInitParameter("context-param");
}
@Override //在doGet中输出参数。protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
System.out.println("initparam:"+initParam);
System.out.println("contextParam:"+contextParam);
}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {this.doGet(req, resp);//调用doGet方法
}
}
初始化之后我们提交数据就会调用doGet方法,将获取到的初始化参数打印出来。
四、页面跳转
4.1请求重定向
请求重定向,即进行页面跳转。
需要用到void sendRedirect(java.lang.String location)
当location是带有/的话,将被解释为容器的根,
即此时的地址会被解释为localhost:8080+location。
例如localtion为"/fail.htm",此时跳转的地址位localhost:8080/fail.html
当没有‘/’时,将解释为相对于当前请求的URL地址。
例如localtion为"fail.htm",此时跳转的是localhost:8080/项目名/fail.html
使用指定的重定向URL向客户端发送临时重定向响应。
获取表达数据采用getParameter(Stringz name),
importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestServlet extendsHttpServlet{private String initParam = null;private String contextParam = null;
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
//获取HTML中设置了 name = "username" 标签的数据
String name= req.getParameter("username");//获取表单提交的数据,//如果输入框的内容等于百度则跳转到百度,其他跳转到fail.html
if("baidu".equals(name))//跳转到百度
resp.sendRedirect("http://www.baidu.com");else
//跳转到当前工程WebContext目录下的fail.html
resp.sendRedirect("fail.html");
}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {this.doGet(req, resp);
}
}
采用重定向的跳转方法,不共享request的信息。
当username输入框的为百度时则跳转到百度首页,
其他的输入跳转到当前项目WebContent下的fail.html
重定向时地址栏会显示重定向资源的路径。
4.2请求转发:将当前请求转发到另一个资源处理。
请求转发时我们需要用到一个接口RequestDispatcher。
TequestDispatcher:接收客户端请求,并将请求发送到服务器上的其他资源(如servlet、html文件或jsp文件)。
主要方法:
void forward(ServletRequest request, ServletResponse response)
将请求转发到服务器上另一资源,request为客户端对Servlet的请求的request对象,
response为表示servlet返回到客户端的响应的servletResponse对象
那么要想调用转发,我们必须向获取一个实现了RequestDispatcher接口的对象。
这时可以request下的RequestDispatcher getRequestDispatcher(java.lang.String path)方法
该方法获取一个RequestDispathcher对象,path为指定资源的路径名,可以为相对路径,
当为相对路径时必须是相对当前Servlet而言的。
请求转发只能在本应用资源下,不能先请求重定向那样跨应用(重定向到百度)。
importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestServlet extendsHttpServlet{private PrintStream out =System.out;private String initParam = null;private String contextParam = null;
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("servlet..");//设置资源路径
RequestDispatcher rd = req.getRequestDispatcher("fail.html");//转发,由于是携带req、resp转发的,所以转发后的资源可以获取其数据。
rd.forward(req, resp);
}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {this.doGet(req, resp);
}
}
但提交表单,进入doGet()方法后,会转发请求到指定的资源。
我们会发现请求转发并没有像重定向那样将URL变为fail.html,这时因为此时转发的是请求。
而且当前servlet输出的信息(“servlet..”)也没有打印出来,
转发就相当于将事情交给另外一个人去处理。自己不插手了。
4.3请求包含:将其他资源的响应结果包含到当前Servlet中。
请求包含和请求转发都是RequestDispatcher中定义的方法。
所以都是首先获取RequestDispatcher对象,然后调用对应方法。
请求包含是调用的是void include(ServletRequest request, ServletResponse response)
importjava.io.IOException;importjava.io.PrintStream;importjava.io.PrintWriter;importjavax.servlet.RequestDispatcher;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class TestServlet extendsHttpServlet{//private PrintStream out = System.out;
private String initParam = null;private String contextParam = null;
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
PrintWriter out=resp.getWriter();
out.println("servlet");//设置资源路径
RequestDispatcher rd = req.getRequestDispatcher("/fail.html");//转发,由于是携带req、resp转发的servlet..,所以转发后的资源可以获取其数据。
rd.include(req, resp);
}
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {this.doGet(req, resp);
}
}
请求包含的url也不会发生变化,并且包含了fail.htm界面。
如果没有servlet,界面上会显示html所代表的内容,即Fail。
但当前界面将fail.htm的代码包含进来了,破坏了html的结构,
所以显示的是servlet+html代码。
包含是当前Servlet将另外一个资源及其处理流程包含进来。
转发时当前Servlet将事情交给另外一个资源去完成。
-
doGet()方法中文乱码问题的解决.doc
2012-09-14 15:18:59Servlet中的doGet()方法默认是用ISO-8819-1显示的,这个字符集不支持中文,而且过滤器对doGet()无效,也不能通过一般方式修改,要想用doGet()显示中文必须通过设置tomcat的字符集才行 -
从Java类调用doGet Servlet方法
2021-07-16 22:18:19} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=... -
Servlet中doGet()测试方法
2015-09-10 17:19:31Servlet中doGet()测试方法,方便测试Servlet中数据库的查询功能 -
doPost和doGet
2021-07-11 16:29:00servlet中的dopost方法中为什么要包含doget方法。 因为前台页面请求的时候有两种方式: <form method=”get”> </form> 这个提交到后台请求的就是doget方法 <form method=”post”> </form... -
servlet doGet()与doPost()使用
2022-03-28 16:42:42servlet doGet()与doPost()使用 一、配置web.xml 在<web-app></web-app>间增加Servlet配置项:[注意大小写,有区别的] <servlet> <servlet-name>Servlet01</servlet-name> <... -
doGet、doPost区别
2021-02-28 18:15:59常见方式get方式:直接在URL地址栏中输入URL、网页中的超链接、form中method为get、form中method为空时,默认是get提交。post:form中method属性为post。数据传送方式get方式:表单数据存放在URL地址后面。... -
Servlet doget方法编码实例
2021-03-20 08:19:57// TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, ... -
Servlet 的 doGet 和 doPost 方法
2021-02-22 00:15:25没错,我们的 doGet 方法和 doPost 方法就和两个参数有关系。当 form 的 method 属性值是 get 时,在提交表单的时候会调用 doGet 方法;当 form 的 method 属性值是 post 时,在提交表单的时候会调用 doPost ... -
doGet()和doPost()的区别
2022-04-27 09:52:45一、doGet()和doPost的区别 1、form运行方式 当form框里面的method为get时,执行doGet方法 当form框里面的method为post时,执行doPost方法 2、生成方式 get方式: (1)直接在URL地址栏中输入URL, (2)网页中的... -
【JavaWeb】Servlet的生命周期、doGet()和doPost()方法说明
2021-12-23 11:49:10编程演示Servlet的生命周期 二、doGet和doPost 1.doGet()方法 2.doPost()方法 3.doGet()和doPost()对比 一、Servlet生命周期 Servlet源码如下,可以看到它是个只有5个方法的interface,所以网络协议、https啥的,... -
doget方法输出出现乱码
2021-11-22 16:08:24本来我是直接搜的解决方法,但是都不怎么管用,有的改conf文件的我也不懂(主要自己不敢随便改,这两天配置出问题搞得我头大),就自己分析了一下。 1.首先我出现乱码的中文直接输出的,而从数据库拿来的并没有任何... -
Servlet中doGet和doPost方法有何区别?
2021-03-08 22:33:22servlet中doPost()和doGet()一般来说我们是用不到doGet方法的,doGet方法提交表单的时候会在url后边显示提交的内容,所以不安全。而且doGet方法只能提交256个字符(1024字节),而doPost没有限制,因为get方式数据的... -
关于dopost()与doget()
2022-05-16 10:55:39关于doget()方法 doGet()用于获取服务器信息,并将其作为响应返回给客户端; doGet()在将服务器信息响应给客户端时,浏览器url后面会出现数据参数及其参数值。若在用户密码登录时是非常不安全的 doGet()服务器随机... -
请问doPost和doGet方法有什么不同,为什么例程里的方法写在doPost里,我的代码只能写在doGet
2019-12-16 10:53:03我的代码只能写在doGet()里,写在doPost()里不会生效  ![图片说明]... -
java-doGet方法完成后,Servlet是否返回响应?
2021-03-05 16:29:56显然,doGet方法的返回类型为void,因此,它不返回任何内容.从这个意义上讲,我使用“返回”一词来表示将响应发送回请求它的客户端.我正在尝试实现一个长轮询的Servlet.最好在我有想要发回的东西之前不发送响应,这将是... -
HttpClientUtils工具类封装,doGet()、doPost()、doPut()、doDelete()
2019-12-08 23:27:10概述 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、... HttpClientUtils工具类封装,doGet()、doPost()、doPut()、doDelete() 1、doGet不带参数示例 // 创建Httpcli... -
html页面无法调用对应servlet中的doGet方法
2022-05-14 11:01:20html页面无法调用对应servlet中的doGet、doPost方法 -
Servlet中doGet和doPost的区别
2022-02-19 12:51:21doGet:处理GET请求 doPost:处理POST请求 当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先判断该请求是GET 操作还是POST 操作。然后它调用下面的一个方法:doGet 或 doPost。如果... -
doGet和doPost请求的区别
2022-02-14 22:38:03建议在servlet中doGet处理查询操作,doPost,处理更新操作 1.get请求的特点: (1).会将请求参数显示在浏览器地址栏,不安全 (2).会将请求参数添加到资源路径的后面,只能提交少量的数据 (3).在刷新请求时,不会有... -
doGet和doPost方法
2020-12-19 11:31:37package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.... * Service方法和doGet方法和doP -
Servlet中的doGet方法(第十九周)
2021-03-08 22:34:05Servlet中的doGet方法doGet方法:doGet方法用来处理客户端浏览器直接访问和表单get方式提交的表单。实例如下(本页面是JSP页面,虽然还没有学到JSP,但我觉得在用Servlet时用JSP已经不是什么难题,况且下面这个JSP是...