JavaEE学习笔记之Servlet/JSP(1)

Servlet 以前也叫 server applet

我们知道服务器端开发(Servlet,JSP)即Web开发:

html/css :制作静态页面

servlet:动态界面(Servlet是sun公司提供的一门用于开发动态web资源的技术)

静态页面和动态页面的区别:看界面与服务器之前有没有数据的交互

Web开发里面的模式(主流的企业级开发模式):

C/S:客户端与服务器

优点:①安全性性高   ②客户端是可以分担服务器的一些功能模块的  

缺点:①必须安装客户端   ②开发成本大   ③维护比较困难  ④不能无缝升级

B/S:浏览器与服务器

优点:①只要开发服务器端就可以了  ②可以实现无缝升级  

缺点:①安全性低   ②所有的功能的都是由服务器端去完成的(高强度的负载)

现在讲的Servlet 就是基于 B/S 模式的。

首先来比较下 CGI 和 Servlet

CGI(Common Gateway Interface):公共网关接口(进程)

特点:

CGI每次都会启动一个进程来处理客户端发来的请求,效率比较低。

CGI遵循HTTP协议

CGI支持多语言开发

Servlet:API在J2EE,SUN公司运营管理(线程

特点:

Servlet每次都会启动一个轻量级的线程来处理客户端发来的请求,效率比较高

Servlet 采用单例的。

接下来明白下 Servlet 中的一些概念:

简单的概念:Servlet就是运行在服务器端的JAVA代码。有自己的一套API

专业的概念:Servlet是一个组件(用很少的代码去完成一个功能)

服务器:就是一台主机,安装一些软件

Tomcat:服务器的容器

bin:可执行文件

webapps:所有部署到服务器上的代码全都在这个文件夹里面

Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:

    1) 编写一个Java类,直接或间接实现servlet接口。

    2) 把开发好的Java类部署到web服务器中。

  
  按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

Servlet类编写

1) 类 间接或者直接实现Servlet接口
三种方式:

    1.实现Servlet接口

    2.继承GenericServlet抽象类

    3.继承HttpServlet抽象类

2) 在web.xml进行 配置

    <servlet>
      <servlet-name>oneServletservlet-name>
      <servlet-class>com.briup.day01.OneServletservlet-class>
  servlet>
  <servlet-mapping>
      <servlet-name>oneServletservlet-name>
      <url-pattern>/oneServleturl-pattern>
  servlet-mapping>

3) 访问

    http://localhost:8888/week2/oneServlet

    http://localhost:8888  代表 服务器根目录 即tomcat_home/webapps 

    week2 代表项目名

    /oneServlet 代表 servlet 的 url

Servlet生命周期以及工作原理

1)生命周期

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

    2)响应客户请求阶段    调用service()方法(只要收到请求就会调用)

    3)销毁阶段          调用destroy()方法(调用一次)

    Servlet何时被创建:

        1,默认情况下,当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例。

        2,当web.xml文件中如果元素中指定了 子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象
            num
            当num值为0或者大于0时,表示容器在应用启动时就加载这个servlet。
            当num值小于0或者没有指定时,则指示容器在该servlet被选择时才加载。
            正数的值越小,启动该servlet的优先级越高。 

2)工作原理

    Servlet依赖于ServletRequest和ServletResponse接口,这两个接口负责为Servlet接受和发送信息。 HttpServlet也类似。

    当某个Servlet第一次被请求时,服务器(Servlet容器)会生成该Servlet并调用它的init()方法, 再调用其service()方法处理请求【通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应】处理结束后该Servlet会常驻于容器中,下一个请求则不再 重新生成Servlet,而是直接调用常驻的Servlet对象的service()方法。服务器停止时,会调用该Servlet的destroy()方法。因此,在Servlet的一个生命周期中,init()和destroy()仅会被调用一次, 而service()则会被调用多次。

JavaEE学习笔记之Servlet/JSP(1)_第1张图片

配置初始化参数

在Servlet的配置文件web.xml中,可以使用一个或多个标签为servlet配置一些初始化参数。

配置:
<servlet>
            <servlet-name>basic</servlet-name>
            <servlet-class>com.briup.prep.day01.BasicServlet</servlet-class>
            <init-param>
                <param-name>username</param-name>
                <param-value>licy</param-value>
            </init-param>
            //改变servlet初始化时机(在启动项目的时候初始化)
            <load-on-startup>1</load-on-startup>
        </servlet>
获取:
String password = getServletConfig().getInitParameter("username");

ServletContext对象

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过config.getServletContext()方法获得ServletContext对象。

1) 多个Servlet通过ServletContext对象实现数据共享
        ServletContext context = this.getServletConfig().getServletContext();//获得ServletContext对象
        context.setAttribute("data", data);  //将data存储到ServletContext对象中
2) 获取WEB应用的初始化参数
        
        <context-param>
            <param-name>urlparam-name>
            <param-value>jdbc:mysql://localhost:3306/testparam-value>
        context-param>
3) 用servletContext实现请求转发
context.getRequestDispatcher("/login.jsp").forward(request, response);
4) 使用servletContext读取资源文件   
        InputStream is = context.getResourceAsStream("/WEB-INF/init/db.properties");
        System.out.println(is);
        Properties prop = new Properties();
        prop.load(is);
        String name = (String) prop.getProperty("name");
        String gender = prop.getProperty("gender");

HttpServletRequest & HttpServletResponse

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

1) HttpServletResponse

1.向客户端(浏览器)发送数据的相关方法
        getOutputStream()
        getWriter()
2.向客户端(浏览器)发送响应头的相关方法
        addDateHeader()
        addHeader()
        addIntHeader()
        containsHeader()
        setDateHeader()
        setHeader()
        setIntHeader()

        例如:
                response.setHeader("content-type", "text/html;charset=UTF-8");
3.向客户端(浏览器)发送响应状态码的相关方法
        setStatus()

        下载实例:
            private void downloadFileByOutputStream(HttpServletResponse response)
                     throws FileNotFoundException, IOException {
                 //1.获取要下载的文件的绝对路径
                 String realPath = this.getServletContext().getRealPath("/download/1.JPG");
                 //2.获取要下载的文件名
                 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
                 //3.设置content-disposition响应头控制浏览器以下载的形式打开文件
                 response.setHeader("content-disposition", "attachment;filename="+fileName);
                 //4.获取要下载的文件输入流
                 InputStream in = new FileInputStream(realPath);
                 int len = 0;
                 //5.创建数据缓冲区
                 byte[] buffer = new byte[1024];
                 //6.通过response对象获取OutputStream流
                 OutputStream out = response.getOutputStream();
                 //7.将FileInputStream流写入到buffer缓冲区
                 while ((len = in.read(buffer)) > 0) {
                 //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
                     out.write(buffer,0,len);
                 }
                 in.close();
            }

2) HttpServletRequest

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

1.作为容器
        setAttribute(String name,Object o)  将数据作为request对象的一个属性存放到request对象中
        getAttribute(String name)   获取request对象的name属性的属性值
        removeAttribute(String name)移除request对象的name属性
        getAttributeNames()         获取request对象的所有属性名

2.获得客户机信息
        getRequestURL() 返回客户端发出请求时的完整URL。
      getRequestURI()   返回请求行中的资源名部分。
      getRemoteAddr()   返回发出请求的客户机的IP地址。
      getRemoteHost()   返回发出请求的客户机的完整主机名。
      getRemotePort()   返回客户机所使用的网络端口号。
      getLocalAddr()    返回WEB服务器的IP地址。
      getLocalName()    返回WEB服务器的主机名。
        getQueryString()返回请求行中的参数部分。
      getPathInfo() 返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

3.获得客户机请求头

   getHeader(string name)
   getHeaders(String name)
   getHeaderNames()

4.获得客户机请求参数(客户端提交的数据)
        getParameter(String)    方法(常用)
        getParameterValues(String name)方法(常用)
        getParameterNames()     方法(不常用)
        getParameterMap()       方法(编写框架时常用)

5.Request对象实现请求转发
        request.getRequestDispatcher("/test.jsp").forward(request, response);
        request.getRequestDispatcher("/test.jsp").include(request, response);

        调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除
        调用include()方法后,原先存放在HttpResponse对象中的内容将不会被清除,内容追加

你可能感兴趣的:(JavaEE)