动态页面 servlet
动态页面 servlet
芥末小弟 发表于8个月前
动态页面 servlet
  • 发表于 8个月前
  • 阅读 0
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

1.常见软件架构.
C/S: 客户端 服务器  安全性较好,但是升级需要升级两端  
B/S: 浏览器 服务器  安全性较差, 但是升级时 只需要升级服务器端(我们今后就是开发这个架构的)
2.资源分类:
    静态资源: 无论访问多少次 内容都不会发生变化. html .css .js .
    动态资源: 访问结果会发生变化. servlet,jsp . jsp就是servlet. php,asp.
3.常见服务器: tomcat

4.tomcat 会以下配置:
    1.修改tomcat端口号
    2.会配置虚拟目录
    3.会配置虚拟主机(了解)
5.HTTP协议
    就是规范了 浏览器和服务器之间通信的规范(格式)
    请求
        请求首行
        请求头
        请求空行
        请求正文(只有post提交时正文才有内容)
    响应   
        响应首行
        响应头
        响应空行
        响应正文
        常见状态码:
        HTTP/1.1 200 OK
        200: 成功
        404: 访问的资源未找到
        500: 服务器内部错误(通常是开发人员的错)
        302: 重定向(两次请求)
        304: 缓存机制.
---------------------------------------------------------------------------------------------------------------------------------------
servlet    ==>  server applet
    两个动态资源之一(servlet,jsp).
    是javaweb中 servlet技术中三大组件之一.
        *servlet
        *filter
        *listener
如何来写一个servlet呢?
    找到servlet接口 去实现,那么你这个类就是servlet.
    实现servlet的方式:
        *实现servlet接口
        *继承GenericServlet
        *继承HTTServlet
servlet中的生命周期方法:   
    1.init方法:  servlet被创建之后会调用该方法. 但是在服务器运行期间,一个servlet 只存在一个实例.所以通常来讲,init方法只被调用一次(第一次访问时).
                 作用: 可以在init方法中做一些资源初始化动作.例如: 建立数据库连接.....
    2.service方法: servlet真正处理请求,并返回响应的方法. 其中提供两个对象,servletRequest(封装了请求信息,明天讲) ,servletResponse(使用他可以添加响应信息,明天讲)
    3.destory方法: 是在服务器关闭,要销毁servlet之前,会调用该方法. 如果servlet中有一些资源需要释放.那么在destory中操作.
    以上3个方法就是servlet的生命周期方法.
servlet中的另外两个方法:
    4.getServletInfo : 没用的方法,当它不存在
    5.getServletConfig方法: 获得servletConfig对象
ServletConfig对象是干嘛的?

        <servlet>
                  <servlet-name>CServlet</servlet-name>
                  <servlet-class>cn.itcast.servlet.generic.CServlet</servlet-class>
                 <init-param>
                     <param-name>userName</param-name>
                     <param-value>tom</param-value>
                 </init-param>
                 <init-param>
                     <param-name>password</param-name>
                     <param-value>1234</param-value>
                 </init-param>
           </servlet>
          <servlet-mapping>
                  <servlet-name>CServlet</servlet-name>
                  <url-pattern>/CServlet</url-pattern>
          </servlet-mapping>
    4个方法:
        getServletName ==> 返回web.xml中配置的servlet-name
        getInitParameter(key); ==> 根据key获得 init-param中配置的值 
        getInitParameterNames() ==> 返回一个类似于迭代器的枚举,返回配置文件中所有init-param的key
        getServletContext ==> 返回一个servletContext对象,这个对象下午讲.
    //优化 ==> GennericServlet中的优化
        以前获得ServletName需要这么调用 ==>  this.getServletConfig().getServletName()==>优化后 我想这么调 ==>  this.getServletName();
        ==>让我们的servlet当中含有该方法就可以==> 可以自己在servlet中去定义getServletName()方法,但是麻烦 ==> 直接让我们的servlet实现servletConfig接口
        ==>config接口中的4个方法都有了.==> 怎么实现?直接使用init方法中传递过来的servletConfig的实现类来实现就可以 ==>  init方法中我们要接受传过来的servletConfig的实现类
        ==> 别人继承我们GenericServlet的时候 不能再重写init方法了. 我们就自己定一个空参的init方法.==> 别人如果想要初始化的动作,重写我们给他准备的无参init方法即可.
//===================================================================================================================================================
复习如何开发一个servlet
    1.创建一个类,实现servlet接口
    2.手动编译这个类,将这个类放到WEB-INF/classes目录下.(现在MyEclipse帮我们做了)
    3.在web.xml中配置这个servlet,如下:
            <servlet>
                <servlet-name>AServlet</servlet-name>
                <servlet-class>cn.itcast.servlet.AServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>AServlet</servlet-name>
                <url-pattern>/AServlet</url-pattern>
            </servlet-mapping>
    4.把这个web项目部署到服务器(tomcat)上去.
servlet在服务器中的运行流程(自己看图)
//===============================================================================================================================================

HTTPServlet

    1.帮我们把reqeust对象和response对象 进行强转. ==> HTTPServletRequest HTTPServletResponse
    2.根据请求方式不同调用不同的方法例如 POST ==> doPost 方法  GET ==> doGet方法
以后我们开发 全都继承HTTPServlet就可以.

//-----------------------------------------------------------------------------------------------------------------------------------------------

Servlet中的一些细节

    1.关于Servlet的线程安全问题
        因为一个servlet的实例在服务器中只存在一份. ==> 当有多个请求访问时,servlet线程将不安全.
        如何规避线程安全问题呢? ===>  我们接受线程的信息时,将信息保存在方法的变量中,不要使用成员变量保存.

    2.关于servlet中路径配置问题
            <!--
                  路径配置分为两种情况
                    路径匹配
                        /DServlet   ==>  http://localhost:8080/Day10/DServlet
                        /ABC/DServlet  ==> http://localhost:8080/Day10/ABC/DServlet
                        /ABC/BCD/DServlet ==> http://localhost:8080/Day10/ABC/BCD/DServlet
                        /ABC/*  ==>  http://localhost:8080/Day10/ABC/asdlkajsdlkjalsd
                        /       ==> 匹配所有路径 http://localhost:8080/Day10/2139009123j/asd2klnasd
                        匹配优先级: 路径匹配中 ,匹配的范围越广,优先级越低.
                    后缀名匹配
                        *.do        ==>  http://localhost:8080/Day10/213oiajsdoijoad.do
                        *.action    ==>  http://localhost:8080/Day10/lnasdljasdlkasljdasd.action
                        *.abc        ==>   http://localhost:8080/Day10/1039i09ixc0kasd.abc
                    这种路径匹配在现在学习阶段接触不到. 在学到Filter 和struts2 的时候就用到了.
                    !!!!!!!注意: 以上两种匹配方式不能同时使用
                            例如下面是绝对错误的:
                                /DServlet/*.do  ==> 凡事路径配置中以"/"开头那么就说明含有路径匹配.这种时候再使用*.do 这种后缀名匹配绝对报错.
                   -->

    3.(拓展)关于tomcat中web.xml的信息
        1> defaultServlet 配置的路径是 "/" ==>  所有跟我的路径匹配不上的路径都会走default.default主要干两件事  1.找静态资源  2.找不到静态资源报错.
        2>session相关的配置 ==> 30  ==> 学session的时候就知道了
        3>将所有MIME类型 都列举出来了.
        4>welcome list file ==> 默认的欢迎资源.
    4.我们知道servlet默认创建实例的时机是什么时候? ==> 第一次请求该servlet时创建. ==> 如果我们这个servlet创建需要的时间比较久.我们想让servlet随着服务器的启动而启动
    那么我们可以这样做:
            <servlet>
                <servlet-name>AServlet</servlet-name>
                <servlet-class>cn.itcast.servlet.AServlet</servlet-class>
                    <!-- 在启动服务器时加载的意思
                        配置了该配置,那么这个servlet就会在服务器启动时创建实例.
                        这个配置中填写的内容是整数 最小可以填0.
                        数字越小 启动优先级越高. 所以0 表示优先级最高.
                        如果两个数字大小相同,优先级按照配置顺序,谁先配置 谁先创建.
                -->
                <load-on-startup></load-on-startup>
            </servlet>
//------------------------------------------------------------------------------------------------------------------------------------------------------------
ServletContext对象
    介绍   
        1.这个对象代表着咱们的整个项目.==> 这个对象在一个项目中只存在一个实例.
        2.启动项目的时候会自动创建. 关闭服务器的时候会销毁该实例.
        3.该对象如何获取呢? ==>  servletConfig 中 有一个方法叫做 getServletContext方法 来获得.
    功能
        一:可以获得项目中的一些配置(web.xml)
            getInitParameter(String name) 根据键获得值
            getInitParameterNames()   获得所有键
        上面这两个方法名字与servletConfig中的一模一样.但是获得的配置信息是
            <context-param>
                     <param-name>userName</param-name>
                     <param-value>tom</param-value>
            </context-param>
            <context-param>
                     <param-name>password</param-name>
                     <param-value>1234</param-value>
            </context-param>
        二:作为我们servlet技术中 三大域对象之一.  如果包含jsp的话,其实有4大域 page域.
                        application ==> servletContext
                        session
                        request
                    域对象涉及到4个方法
                        getAttribute(key)  根据键获得值
                        setAttribute(key,value) 往application域中的map 存放一个键值对
                        removeAttribute(key) 从application域中的map 删除一个键值对
                        getAttributeNames(); 从application域中的map 获得所有的键
        三:可以获取项目中的资源.(例如获得项目中存放学生的stu.xml)
                //想对WEB-INF/Demo.xml进行操作.我们要先读取出该文件
                //如何来读取呢?
                    //File file = new File("E:/代码/Workspaces0808/Day10-servlet/WebRoot/WEB-INF/demo.xml");
                //上面获得demo.xml填写的路径显然是不对的.获得的是工程下的而我们要获得最终部署到服务器上的.
                    //File file = new File("E:/apache-tomcat-6.0.35/webapps/Day10-servlet/WEB-INF/demo.xml");
                //上面这种获得方式就对了.但是 如果把项目再部署到其他地方,那上面这个写死的路径就无效了.
                //这样类似获得外部资源的例子很多,所以servletContext对象给出了解决办法.
                        //getRealPath("/")  ==> 获得绝对路径 ,根据参数中的相对路径获得. "/"相对于WebRoot
                        //getResourceAsStream("/"); ==>直接获得 想要找的资源的流 . 参数还是填相对路径,同上
                例子:
                    String path = getServletContext().getRealPath("/WEB-INF/demo.xml");
                    System.out.println(path);
                    InputStream is =  getServletContext().getResourceAsStream("/WEB-INF/demo.xml");
                    System.out.println(is);
//---------------------------------------------------------------------------------------------------------------------------------------
使用Class和ClassLoader 获得项目中的资源路径   
    //web-inf下的
            String path1 = getServletContext().getRealPath("/WEB-INF/demo.xml");
        //lib下的
            String path2 = getServletContext().getRealPath("/WEB-INF/lib/demo.xml");
        //src下的
            String path3 = getServletContext().getRealPath("/WEB-INF/classes/demo.xml");
        //cn.itcast.servlet.servlet_context包下的
            String path4 = getServletContext().getRealPath("/WEB-INF/classes/cn/itcast/servlet/servlet_context/demo.xml");
        //其实上面例子中path3 和 path4 这两种方式 有些麻烦
            //在介绍一种获得资源的方式,是对.class ==> Class 和 classLoader的应用
            InputStream is = this.getClass().getResourceAsStream("demo.xml"); // 如果不加"/"==> 相对的是类的当前(包)目录
            InputStream is2 = this.getClass().getResourceAsStream("/demo.xml");//如果加了"/" ==> "/"就代表classes目录(src)
            //在说下classLoader 下也有方法  classLoader 就是类的加载器. ==> 专门来读取class文件的输入流
            //也提供了读取其他文件的方法.(使用classLoader不要读取较大的文件)
            // this.getClass().getClassLoader() ==> 获得类的加载器
            InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("/demo.xml");// 不论加不加"/",都相对于 classes目录,跟class中加"/" 的相对路径是一样的.
            //使用class或classLoader 也可以获得文件的绝对路径
            URL url =    this.getClass().getResource("demo.xml");
            System.out.println(url.getPath());

作业:
    写一个servlet, 实现访问次数统计的功能.
    例如:第一次访问这个servlet时, 给用户显示您是第一访问
        第2次访问时显示 您是第2次访问 ........以此类推.
    其他servlet也要参与统计.(servletContext 中 域的应用)

共有 人打赏支持
粉丝 0
博文 202
码字总数 120715
×
芥末小弟
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: