关于JSP和Servlet

Servlet总结
在Java Web程序中,Servlet主要负责接收用户请求 HttpServletRequest,在doGet(),doPost()中作相应的处理,并将回应HttpServletResponse反馈给用户。Servlet 能够设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在它初始化时调用init()方法,销毁时调用destroy()方法**。**Servlet须要在web.xml中配置(MyEclipse中建立Servlet会自动配置),一个Servlet能够设置多个URL访问。Servlet不是线程安全,所以要谨慎使用类变量。

阐述Servlet和CGI的区别?

CGI的不足之处:
1,须要为每一个请求启动一个操做CGI程序的系统进程。若是请求频繁,这将会带来很大的开销。

2,须要为每一个请求加载和运行一个CGI程序,这将带来很大的开销

3,须要重复编写处理网络协议的代码以及编码,这些工做都是很是耗时的。

Servlet的优势:

1,只须要启动一个操做系统进程以及加载一个JVM,大大下降了系统的开销

2,若是多个请求须要作一样处理的时候,这时候只须要加载一个类,这也大大下降了开销

3,全部动态加载的类能够实现对网络协议以及请求解码的共享,大大下降了工做量。

4,Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库链接池之类的功能很容易实现。

补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用一般包含一个或多个Servlet类。Servlet不可以自行建立并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。一般一个Servlet会关联一个或多个JSP页面。之前CGI常常由于性能开销上的问题被诟病,然而Fast CGI早就已经解决了CGI效率上的问题,事实上有不少你熟悉的网站都使用了CGI技术。

Servlet接口中有哪些方法及Servlet生命周期

Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:java

void init(ServletConfig config) throws ServletException
    void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
    void destroy()
    java.lang.String getServletInfo()
    ServletConfig getServletConfig()


生命周期: Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据须要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。init方法和destroy方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些须要初始化与销毁的资源,所以能够把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不须要每次处理客户端的请求都要初始化与销毁资源。

get和post请求

能够把 get 和 post 看成两个不一样的行为,二者并无什么本质区别,底层都是 TCP 链接。 get请求用来从服务器上得到资源,而post是用来向服务器提交数据。好比你要获取人员列表能够用 get 请求,你须要建立一我的员能够用 post 。这也是 Restful API 最基本的一个要求。

转发(Forward)和重定向(Redirect)的区别

转发是服务器行为,重定向是客户端行为。

转发(Forward) 经过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现的。RequestDispatcher能够经过HttpServletRequest 的getRequestDispatcher()方法得到。例以下面的代码就是跳转到login_success.jsp页面。git

request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect) 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器经过 HttpServletResponse 的 setStatus(int status) 方法设置状态码。若是服务器返回301或者302,则浏览器会到新的网址从新请求该资源。

    从地址栏显示来讲

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因此它的地址栏仍是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器从新去请求那个地址.因此地址栏显示的是新的URL.

    从数据共享来讲

forward:转发页面和转发到的页面能够共享request里面的数据. redirect:不能共享数据.

    从运用地方来讲

forward:通常用于用户登录的时候,根据角色转发到相应的模块. redirect:通常用于用户注销登录时返回主页面和跳转到其它的网站等

    从效率来讲github

forward:高. redirect:低.

自动刷新(Refresh)

自动刷新不只能够实现一段时间以后自动跳转到另外一个页面,还能够实现一段时间以后自动刷新本页面。Servlet中经过HttpServletResponse对象设置Header属性实现自动刷新例如:

Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");

其中5为时间,单位为秒。URL指定就是要跳转的页面(若是设置本身的路径,就会实现每过5秒自动刷新本页面一次)

Servlet与线程安全

Servlet不是线程安全的,多线程并发的读写会致使数据不一样步的问题。 解决的办法是尽可能不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块能够解决问题,可是会形成线程的等待,不是很科学的办法。 注意:多线程的并发的读写Servlet类属性会致使数据不一样步。可是若是只是并发地读取属性而不写入,则不存在数据不一样步的问题。所以Servlet里的只读属性最好定义为final类型的。

JSP和Servlet是什么关系

其实这个问题在上面已经阐述过了,Servlet是一个特殊的Java程序,它运行于服务器的JVM中,可以依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个相似于Servlet的Java程序,能够简化页面内容的生成。Servlet和JSP最主要的不一样点在于,Servlet的应用逻辑是在Java文件中,而且彻底从表示层中的HTML分离开来。而JSP的状况是Java和HTML能够组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,固然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。

JSP工做原理

JSP是一种Servlet,可是与HttpServlet的工做方式不太同样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工做目录里面。下面经过实例给你们介绍。 工程JspLoginDemo下有一个名为login.jsp的Jsp文件,把工程第一次部署到服务器上后访问这个Jsp文件,咱们发现这个目录下多了下图这两个东东。 .class文件即是JSP对应的Servlet。编译完毕后再运行class文件来响应客户端请求。之后客户端访问login.jsp的时候,Tomcat将再也不从新编译JSP文件,而是直接调用class文件来响应客户端请求。 JSP工做原理 因为JSP只会在客户端第一次请求的时候被编译 ,所以第一次请求JSP时会感受比较慢,以后就会感受快不少。若是把服务器保存的class文件删除,服务器也会从新编译JSP。

开发Web程序时常常须要修改JSP。Tomcat可以自动检测到JSP程序的改动。若是检测到JSP源代码发生了改动。Tomcat会在下次客户端请求JSP时从新编译JSP,而不须要重启Tomcat。这种自动检测功能是默认开启的,检测改动会消耗少许的时间,在部署Web应用的时候能够在web.xml中将它关掉。

JSP有哪些内置对象、做用分别是什么

JSP有9个内置对象:

    request:封装客户端的请求,其中包含来自GET或POST请求的参数;
    response:封装服务器对客户端的响应;
    pageContext:经过该对象能够获取其余对象;
    session:封装用户会话的对象;
    application:封装服务器运行环境的对象;
    out:输出服务器响应的输出流对象;
    config:Web应用的配置对象;
    page:JSP页面自己(至关于Java程序中的this);
    exception:封装页面抛出异常的对象。

include指令include的行为的区别

include指令: JSP能够经过include指令来包含其余文件。被包含的文件能够是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。 语法格式以下: <%@ include file="文件相对 url 地址" %>

include动做: <jsp:include>动做元素用来包含静态和动态的文件。该动做把指定文件插入正在生成的页面。语法格式以下: <jsp:include page="相对 URL 地址" flush="true" />

JSP中的四种做用域

JSP中的四种做用域包括page、request、session和application,具体来讲:

    page表明与一个页面相关的对象和属性。
    request表明与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;须要在页面显示的临时数据能够置于此做用域。
    session表明与某个用户与服务器创建的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户本身的session中。
    application表明与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局做用域。

如何实现JSP或Servlet的单线程模式

对于JSP页面,能够经过page指令进行设置。 <%@page isThreadSafe="false"%>

对于Servlet,可让自定义的Servlet实现SingleThreadModel标识接口。

说明:若是将JSP或Servlet设置成单线程工做模式,会致使每一个请求建立一个Servlet实例,这种实践将致使严重的性能问题(服务器的内存压力很大,还会致使频繁的垃圾回收),因此一般状况下并不会这么作。

实现会话跟踪的技术有哪些

    一、使用Cookie

向客户端发送Cookieweb

Cookie c =new Cookie("name","value"); //建立Cookie
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中

从客户端读取Cookie数据库

String name ="name"; Cookie[]cookies =request.getCookies(); if(cookies !=null){ for(int i= 0;i<cookies.length;i++){ Cookie cookie =cookies[i]; if(name.equals(cookis.getName())) //something is here. //you can get the value
 cookie.getValue(); } }

优势: 数据能够持久保存,不须要服务器资源,简单,基于文本的Key-Value

缺点: 大小受到限制,用户能够禁用Cookie功能,因为保存在本地,有必定的安全风险。

    二、 URL 重写

在URL中添加用户会话的信息做为请求的参数,或者将惟一的会话ID添加到URL结尾以标识一个会话。

优势: 在Cookie被禁用的时候依然可使用

缺点: 必须对网站的URL进行编码,全部页面必须动态生成,不能用预先记录下来的URL进行访问。

   3.隐藏的表单域

<input type="hidden" name ="session" value="..."/>

优势: Cookie被禁时可使用

缺点: 全部页面必须是表单提交以后的结果。

    四、HttpSession

在全部会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动建立 HttpSession,每一个用户能够访问他本身的HttpSession。能够经过HttpServletRequest对象的getSession方 法得到HttpSession,经过HttpSession的setAttribute方法能够将一个值放在HttpSession中,经过调用 HttpSession对象的getAttribute方法,同时传入属性名就能够获取保存在HttpSession中的对象。与上面三种方式不一样的 是,HttpSession放在服务器的内存中,所以不要将过大的对象放在里面,即便目前的Servlet容器能够在内存将满时将HttpSession 中的对象移到其余存储设备中,可是这样势必影响性能。添加到HttpSession中的值能够是任意Java对象,这个对象最好实现了 Serializable接口,这样Servlet容器在必要的时候能够将其序列化到文件中,不然在序列化时就会出现异常。

Cookie和Session的的区别

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,可是二者的应用场景不太同样。

Cookie 通常用来保存用户信息 好比①咱们在 Cookie 中保存已经登陆过得用户信息,下次访问网站的时候页面能够自动帮你登陆的一些基本信息给填了;②通常的网站都会有保持登陆也就是说下次你再访问网站的时候就不须要从新登陆了,这是由于用户登陆的时候咱们能够存放了一个 Token 在 Cookie 中,下次登陆的时候只须要根据 Token 值来查找用户便可(为了安全考虑,从新登陆通常要将 Token 重写);③登陆一次网站后访问网站其余页面不须要从新登陆。Session 的主要做用就是经过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪一个用户操做的,由于 HTTP 协议是无状态的。服务端给特定的用户建立特定的 Session 以后就能够标识这个用户而且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。

Cookie 存储在客户端中,而Session存储在服务器上,相对来讲 Session 安全性更高。若是使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密而后使用到的时候再去服务器端解密。浏览器

来自 https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/J2EE%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md安全

相关文章
相关标签/搜索