1.Jsp的九大对象以及作用

1.Jsp的九大对象以及作用

1>out 向客户端输出数据,字节流.out.print(" dgaweyr");
 
2>request 接收客户端的http请求.

String getParameter(String name):得到表单参数名name的值.
String[] getParameterValues(String name):(得到String[]复选框时常用).
setAttribute(String name,Object obj):设置属性名为name,属性值为obj.
getAttribute(String name);得到属性值.
 
3>response:封装jsp产生的回应,然后发送到客户端以响应客户的请求.重定向跳转任意界面.(服务器跳转)

addCookie(Cookie cookie):
sendRedirect("/wel.jsp"):跳转到指定页面
 
4>session:用于保存用户信息,跟踪用户行为,当前打开的浏览器内,多个页面共享数据. session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止.它是HttpSession类的实例.

setAttribute(String name,Object obj):设置属性名为name,属性值为obj.
getAttribute(String name):得到属性值.
 
5>application对象:实现了用户间数据的共享,可存放全局变量.它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问.服务器的启动和关闭决定了application对象的生命.它是ServletContext类的实例.
 
session,application,request的区别:
一个项目中session尽量少用几个,因为过多的session会影响程序的执行效率.它主要用于保存登录信息(用户信息,权限,资源)即频繁使用的信息.
application: 用于多个浏览器之间共享数据,多个用户共享该对象,可以做计数器.它的用法与session完全一样.
数据范围:
application(服务器关闭时失效)>session(浏览器关闭时失效)>request(只能用于两个跳转页面之间)
 
6>page对象代表jsp这个实体本身,即当前页面有效.相当于java中的this.

数据范围:page<session<application
 
7>.exception:代表运行时的异常.

在会发生异常的页面加入指令:<%@ page errorPage="处理错误的页面.jsp"%>
在处理异常的页面写入:<%@ page isErrorPage="true"%>
 
8>.pageContext对象 pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext.
 
9>.config jsp对应的servlet的配置,可以得到web.xml中的初使化参数.



(1)静态导入(include指令)通过file属性指定被包含的文件,并且file属性不支持任何表达式;动态导入(include动作)通过page属性指定被包含的文件,且page属性支持JSP表达式;

(2)使用静态导入(include指令)时,被包含的文件内容会原封不动的插入到包含页中,然后JSP编译器再将合成后的文件最终编译成一个Java文件;使用动态导入(include动作)包含文件时,当该标识被执行时,程序会将请求转发(不是请求重定向)到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码。因为服务器执行的是多个文件,所以JSP编译器会分别对这些文件进行编译;

(3)使用include指令包含文件时,由于被包含的文件最终会生成一个文件,所以在被包含、包含文件中不能有重名的变量或方法;而include动作包含文件时,由于每个文件是单独编译的,所以在被包含文件和包含文件中重名的变量和方法是不相冲突的。

(4)静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet,因此被导入页面甚至不需要是一个完整的页面;而动态导入则在Servlet中使用include方法来引入被导入页面的内容;

(5)静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。


3.Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

扫描二维码关注公众号,回复: 4142020 查看本文章

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup> 1 </loadon-startup>

    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

    

Servlet工作原理:

  首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

  Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。

public  void  service(ServletRequest req,ServletResponse res)
   throws  ServletException,IOException
{
       HttpRequest request;
       HttpResponse response;
 
      try
      {
          req = (HttpRequest)request;
          res = (HttpResponse)response;
       } catch (ClassCastException e)
       {
          throw  new  ServletException( "non-HTTP request response" );
       }
       service(request,response);
}

    代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误信息,

protected  void  doGet(HttpServletRequest res,HttpServletResponse resp)
   throws  ServletException,IOException
{
    String protocol = req.getProtocol();
    String msg = IStrings.getString( "http.method_get_not_supported" );
    if (protocol.equals( "1.1" ))
    {
       resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);
     }
    esle
     {
       resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);
     }
}

所以需要我们在自定义的Servlet中override这些方法!


4. java中4中修饰符分别为public、protect、default、private,详细讲述下它们的访问权限问题。(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况。)

    首先在这里把它们的访问权限表示出来:

    访问权限   类   包  子类  其他包

    public     ∨   ∨   ∨     ∨

    protect    ∨   ∨   ∨     ×

    default    ∨   ∨   ×     ×

    private    ∨   ×   ×     ×





猜你喜欢

转载自blog.csdn.net/ido1ok/article/details/78300245