java web 中servlet原理以及创建方法详解内含众多知识点

来源:互联网 发布:金融行业数据分析报告 编辑:程序博客网 时间:2024/06/03 17:31

servlet原理

1.什么是servlet?

servlet是用java编写的服务器端程序,采用请求——响应模式提供web服务,是运行在服务器端,

*Servlet是服务器端程序,用来响应客户请求,动态生成响应,继承HttpServlet类,
每个Servlet为一个组件,必须部署到Tomcat中才能运行




2.servlet与JSP有什么关系?

JSP在运行时首先会编译一个servlet,因此,servlet是JSP的基础,

*实际JSPservlet的衍生,JSP本质还是servlet

3.前台页面的创建【form表单的编写】:

3.1   form表单的编写方法有doget和dopost方法

两者的区别在于

一、生成方式
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数据提交方式;
二、在做数据查询时,建议用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得到的每个数据进行编码转换了。


4.servlet的生命周期?

1)加载和实例化

加载和实例化servlet是由servlet容器实现的,加载servlet之后,容器会通过java的反射机制来创建servlet的实例。

2)初始化

在servlet的实例创建后,容器会调用servlet的init()方法来初始化该servlet对象。初始化的目的是让servlet对象在处理客户端请求前先完成一些初始化工作。对于每个servlet实例,只会调用一次init()方法。

3)服务/执行

当客户端请求到来后,servlet容器首先针对该请求创建servletRequest和servletResponse两个对象,然后servlet容器会自动调用servlet的service()方法来响应客户端的请求,同时把servletRequest和servletResponse两个对象传给service()方法,通过servletRequest对象,servlet实例可以获得客户端的请求信息,处理完请求后则将响应信息放在servletResponse对象中,最后销毁servletResponse和servletResponse对象。

注意:在service()方法调用前,init()方法必须已经成功执行。

4)销毁

当servlet实例需要从服务中移除时,容器会调用destory()方法,让该实例释放掉它所使用的资源,并将实例中的数据保存到持久的存储设备中,之后,servlet实例便会被java的垃圾回收器所回收。

在servlet的整个生命周期中,其初始化和销毁都只发生一次,service()方法的执行次数取决于servlet被客户端所访问的次数。

构造方法:

init():

该方法在javax.servlet.Servlet接口中定义。创建servlet实例时会调用init()方法,在init()方法中完成类似于构造方法的初始化功能,其参数为servletConfig的实例。init()方法结束后,servlet就可以接受客户端请求。

在servlet的整个生命周期中,只执行一次init()方法。

service():

该方法用来响应客户端发出的请求,service()方法使用servletResquest接口和servletResponset接口的对象作为参数,其中,servletRequest对象用来处理请求,servletResponse对象用来发送响应。

service()方法执行时会检查HTTP请求的类型,并相应地调用doGet()、doPost()等方法,因此通常的做法是,不使用service()方法直接使用doGet()和doPost()等方法来处理请求。

service()方法的语法形式如下:

public void service (servletRequest request,ServletResponse response)throws ServletException ,IOEception

其中,resquest是ServletRequest接口的对象,它作为参数来接收和存储客户端请求,response是ServletResponse接口的对象,它包含了servlet做出的响应。

doGet()/doPost():

destroy():

当不再需要servlet实例或重新装入时,destory()方法被调用。使用destory()方法可以释放掉所有在init()方法中申请的资源,一个servlet实例一旦终止,就不允许再次被调用。只能等待被卸载。

destory()方法通常用来执行一些清理任务,在destory()方法中一般安排释放资源的代码。

原理:从Servlet的第一次请求开始(因为这时Servlet对象还没有创建),先执行new的操作(构造方法),再调用init()进行初始化。接着等待请求的到来,一旦有请求到来,service()方法被调用,根据请求类型决定调用doGet()/doPost()。只要有请求到来就会重复service()-->doGet()/doPost()这一过程。当服务器重启或者关闭时,destroy()方法被调用,进行销毁Servlet对象工作

 

注意:修改了Servlet文件中的代码后要重启Tomcat。


5.数据的传递方式:

1).从页面到Servlet
request.getParameter("param");
2)从servlet到servlet或JSP页面


6.Web.xml文件中servlet的配置?
创建web.xml方法:你的项目上右键找到javaee工具点击第二项,web.xml就是告诉服务器toomcat你的项目有哪些服务信息

<servlet>

  <servlet-name>name</servlet-name>

  <servlet-class>classname</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>name</servlet-name>

  <url-path>/xxxx</url-path>

</servlet-mapping>

7.页面跳转有那几种方式?

内部跳转和外部跳转

对于内部跳转,地址栏没有变化,对于外部跳转,地址栏有变化

请求转发(内部跳转)与重定向(外部跳转)

请求转发:由服务器内部将请求转发给另一个Servlet/JSP资源,由其他资源去处理。在整个过程中,客户端(浏览器)没有意识到请求已转向,请求对象和响应对象都只有一个,浏览器的地址栏没有变化

页面重定向:由服务器向客户端发出一个特殊的响应,指导客户端重新向另一个资源发出新的请求。在这一过程中,客户端是清楚重定向的目标地址的,请求对象和响应对象是重新创建的,地址栏有变化


8.重定向和转发

请求转发,又称内部跳转,用ResquestDispatcher对象的forward()方法。

请求重定向,又称外部跳转,用Response对象的sendRedirect()方法。


通常接收到一个请求并处理后会让客户端访问一个指定的页面,这个过程可以通过两种方式来完成。

建立一个登陆页面如果用户名密码正确则返回登陆成功页面,否则返回登陆失败页面

方式一:

重定向:使用response对象的sendRedirect(“demo.html”)
原理是客户端向服务器发一次登陆请求,服务端通过请求对象获取请求重定向对象,帮助客户端完成了要去的目的地,也就是说客户端只发了一次请求,剩下的事情都由服务端帮其完成
请求完的结果:
地址栏中显示第一次而且仅这一次的地址,而显示的内容也许是服务端处理后的最后页面,而非第一次请求的内容。也就是说在该例子中:登陆是通过一个loginservlet来处理的,无论是否成功地址栏只显示servlet,而不显示成功页面或者失败页面地址。因为servlet就是客户端的第一次请求。也就是地址栏不发生变化。而且该种方式只能定向到web应用程序内的资源。
因为是一次请求,而剩下的请求都由服务器来完成,那么请求重定向对象的forward方法会将客户端的请求以及应答对象向下个页面传递,也就是说自始自终都是同一个请求。这样的好处是可以在下个页面比如jsp页面中对该请求进行操作等。

方式二:

    请求转发器:通过request对象的getRequestDispatcher(“demo.html”);获取请求转发器对象RequestDispatcher,使用该对象的forward()方法进行转发。

               原理是客户端向服务端发一次登陆请求,服务端对其进行处理后,通过应答对象告诉客户端要去的目的,那么客户端就再一次向服务器发一个请求,请求目的页面。

请求完的结果:

    在地址栏中显示最后一次服务端返回的请求地址。该地址可以是应用程序内部的资源,也可以是任意一个网络资源。      比如:可以定一个绝对地址百度。也就是地址栏发生变化。

因为是多次请求,所以每一次的请求和应答对象都不同。

请求转发与页面重定向的区别:

1、 请求转发只能将请求转发给同一个WEB应用程序中的其他资源,而重定向不仅可以重定向到同一个WEB应用程序中的其他资源,还可以重定向到其他的应用程序的资源。

2、 请求转发浏览器的URL不会改变,而重定向浏览器的URL会改变

3、 请求转发在页面跳转时使用的是相同的request和response,而重定向在页面跳转时是不同的request和response

4、 请求转发在页面跳转时一共只有1次请求和1次响应,而重定向在页面跳转时一共有2次请求和2次响应


9.解决乱码问题的方法?

乱码出现时期

请求时 request

应答时 response


通过两个对象的setCharacterEncoding(“utf-8”)方法进行字符

集指定。

request对象的该方法是对请求体中的数据进行编码。所以对post

请求有效。而且还要在获取参数前调用该方法。

response对象的该方法必须在getWriter之前调用,执行级别高

于。

解决方法:

解决乱码问题中,设置请求内容的字符编码?

request.setCharacterEncoding(“utf-8”);

解决乱码问题中,设置输出内容及字符编码

       response.setContentType(“text/html;charset=utf-8”);

关键代码:

request.setCharacterEncoding(“utf-8”);

response.setContentType(“text/html;charset=utf-8”)或者response.setCharacterEncoding(“utf-8”);

阅读全文
1 0
原创粉丝点击