Servlet

头像
    阅读 6 分钟
    1

    Servlet

    一、什么是Servlet

    Servlet 是由SUN公司提供的一门动态Web资源开发技术(规范,接口)
    
    静态Web资源: 不同的人去访问看到的效果都是相同的
        HTML/css/js等
    动态Web资源: 在不同的条件下看到的是不同的效果
        Servlet/JSP/.NET/PHP等
    
    Servlet是本质上是一个Java程序,但和我们之前接触的Java程序不同的是,
    Servlet无法独立运行(Servlet中没有main函数)
    需要将Servlet程序放在服务器中,由服务器调用才可以执行!
    
    运行在服务器中的Servlet程序作用是: 对服务器接收的请求进行处理(处理请求)
    

    二、开发Servlet程序
    1、开发Servlet程序的步骤

    1)写一个类,需要实现一个Servlet接口或者继承Servlet接口的子类
        Servlet
          |-- GenericServlet 实现了Servlet接口,并实现了其中的方法
                      |-- HttpServlet 继承了GenericServlet,也实现了其中的方法
        在开发时,我们只需要继承HttpServlet,并继承其中的方法即可!
    
    2)在web.xml文件中配置Servlet对外访问的路径,再将Web应用发布到服务器即可!
    

    2、通过Eclipse创建一个Web应用

    注意事项:
    1)Dynamic Web Version:选择2.5版本,因为2.5版本之后是通过注解配置Servlet,
        注解配置Servlet是变简单了,但是不好理解,因此我们选择2.5版本,
        使用xml配置Servlet(xml配置Servlet的信息不用我们手写,会自动生成!)    
    
    2)Web项目推荐使用 Package Explorer 打开, 不要使用 Project Explorer!!
    
    3)Web项目在Eclipse中的目录结构
        CGB-Servlet-01(We项目)
            |-- src: 其中用于存放java源文件(xx.java),也可以放配置文件(xml/properties)
            |-- build/classes: src源码目录中的东西经过编译后,会放到classes目录下
            |-- WebContent: 是Web应用的根目录,其中可以存放静态Web资源文件、
                        编译后的class文件、Web应用所依赖的jar包、web.xml文件等
                    |-- WEB-INF
                          |-- lib: Web应用所依赖的jar包
                          |-- web.xml: web应用的核心配置文件(配置Servlet等)
    
    

    2、运行Servlet程序

    第一种运行方式: 
        直接在要运行的文件(html/jsp/servlet等)上-->右键-->Run as-->Run On Server,
    eclipse会帮我们做如下几件事儿:
    1)将Servlet所在的Web项目(CGB-Servlet-01)发布到服务器中
    2)再启动tomcat服务器
    3)最后打开浏览器,在地址栏输入路径去访问这个Servlet
    Eclipse默认用内置浏览器去访问Servlet,但是这个内置浏览器有bug,最好是使用本地的浏览器去测试!
    
    第二种运行方式: 可以自己手动将项目发布到服务器、启动服务器、打开浏览器输入地址进行访问!
    

    3、Servlet在web.xml文件中的配置

    全限定类名(全类名): 包名.类名 或者 包名.接口名 
    <servlet>    
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>com.tedu.HelloWorld</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
    1)每创建一个Servlet,eclipse会帮我们生成至少8行配置信息
        这8行配置信息由一个Servlet标签和一个servlet-mapping标签组成
        这两个标签中的<servlet-name>标签中的内容一致,决定了它俩是一组配置
    2)<servlet-class>标签中配置的当前Servlet类的全类名(包名.类名)
        将来服务器根据访问路径找到这个全类名,再利用反射+全类名可以获取当前Servlet类的实例    
    3)<url-pattern>标签中配置了外界该通过什么路径来访问当前Servlet。
        也就是说,这里配置什么路径,外界就得通过什么路径来访问这个Servlet!
    
    注意事项1: Servlet在Web.xml文件中的配置信息是在创建Servlet时,Eclipse帮我们生成的
        如果Servlet不是通过Eclipse创建(比如是复制过来的),Eclipse不会生成Servlet
        配置信息, Servlet没有配置信息是无法访问的(使用注解开发除外)!
    
    注意事项2: 如果不知道什么原因,tomcat服务器启动失败了,可以将Eclipse创建的Server删除,
        再重新创建一份(删除Server同时,也将左侧的Servers项目从工作空间中删除!)
    
    注意事项3: 在将tomcat和Eclipse整合之后,tomcat默认开启了热部署功能:
        在修改了代码后,不用重新发布,也不需要重启服务器,就可以运行最新的效果!
        (如果是创建了新的Servlet类,或者修改了web.xml文件,则需要重启服务器,才会生效!)
    

    4、创建Servlet3.0或以上版本的项目

    在Servlet3.0的项目中,没有web.xml文件,无法通过xml文件配置Servlet信息
    而是通过注解方式配置Servlet相关信息
    
    @WebServlet("/SecondServlet")
    public class SecondServlet extends HttpServlet{}
    
    在@WebServlet这个注解内容所配置的内容就是(xml方式)url-pattern中配置的访问路径
    另外服务器通过扫描注解定位到当前这个Servlet,获取该类的全路径,
    通过全路径从硬盘上加载这个类到内存中,获取该类的字节码对象,再利用反射+字节码对象创建该类的实例!
    

    5、如何配置eclipse在右键-->run as运行一个Web资源之后,用本地的浏览器访问测试

    点击Window --> Web Browser --> 如果右侧有 Chrome 或者 Firefox 选择其中的一个
    如果没有 chrome 或者 firefox, 可以选择 Default System...,即系统默认浏览器
    

    Request

    一、Request和Response介绍

    当浏览器向服务器发请求,服务器在调用Servlet的service方法处理请求之前,会创建代表请求的Request对象,和代表响应的Response对象。
    将这两个对象传递给service方法,在service方法处理请求的过程中,如果要获取请求信息,可以通过request提供的方法进行获取;如果要向浏览器响应数据,可以将数据先写入到response缓冲区,等service方法执行结束,服务器会自动到response对象中获取到要发送给浏览器的数据,按照Http协议的格式将数据发送给浏览器。
    

    二、Request常用功能
    1、获取请求参数
    1.1.什么是请求参数?

    所谓的请求参数就是浏览器在发送请求时,带给服务器的数据。
    例如:在地址栏URL地址的后面可以通过问号拼接参数,将数据带给服务器
        http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu
    也可以通过表单,将数据写入表单项中,通过提交表单将数据带给服务器
    无论通过哪种方式带参数给服务器,参数都可以有多个,多个参数之间用&分隔,每一个参数都包含参数名和参数值
    

    1.2.如何获取请求参数?

    http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu
    1)request.getParameter(String paramName) -- 返回String字符串
    -- 通过请求参数的名字,获取对应的参数值。比如传入"user",返回"zhangsan"
    -- 如果获取的参数有多个值,该方法只会返回第一个值,比如传入"like",只返回一个"lanqiu"
    -- 如果获取的参数是不存在的,该方法会返回null,比如传入"uesr",此时会返回null值
    
    2)request.getParameterValues(String paramName) -- 返回String[]数组
    -- 通过请求参数的名字,获取对应的所有参数值组成的数组。比如传入"like",返回
        {"lanqiu", "zuqiu"}
    -- 如果获取的参数值只有一个,该方法仍然返回一个数组,比如传入"user",返回 {"zhangsan"}
    --  如果获取的参数是不存在的,该方法会返回null,比如传入"uesr",此时会返回null值
    

    1.3.如何处理在获取请求参数时出现的中文乱码问题?

    GET提交参数是通过URL地址后面拼接参数,将参数提交给服务器
    POST提交参数是通过请求实体将参数提交给服务器
    服务器在接收GET提交的参数时,默认使用UTF-8来进行接收(浏览器提交参数用的也是utf-8),因此获取GET提交的参数没有问题。
    但服务器在接收POST提交的参数时,默认使用iso8859-1来进行接收,而这个编码中没有中文字符,因此在接收中文数据时,会出现乱码问题。
    解决方法是:通知服务器接收POST提交的参数时,也通过utf-8来进行接收
        request.setCharacterEncoding("utf-8");
    注意:这行代码要放在获取参数的代码之前执行!
        这行代码只对POST提交生效,GET比较不受任何影响!
    

    2、实现请求转发

    所谓的请求转发是服务器内部资源之间的跳转方式(从一个资源跳转到另外一个资源)
    请求转发(forward)的特点:
    1)转发是一次请求一次响应
    2)转发前后地址栏地址不会发生变化
    3)转发只能在同一个Web应用内部两个资源之间进行跳转
    4)在转发的两个资源之间可以利用request域(map)传递数据
    
    请求转发的实现代码:
        /* 将请求转发到 TestForward2 
         * TestForward2: http://localhost:8080/CGB-Servlet-03/TestForward2
         * 由于服务器会在转发的路径前面自动的拼上项目路径, 因此我们在传路径时, 
         * 只需要传项目路径后面的路径, 项目路径及之前的路径不传
         */
        request.getRequestDispatcher( "/TestForward2" )
                    .forward( request, response );
    

    3、作为域对象使用(需要配合转发)

    在请求转发时,会将request对象传递给所转发的资源(A--转发-->B,会将A中的request传递给B)
    可以在转发之前,往request的map中存入数据,再转发,由于转发时会将request带到所转发的资源
    在转发的资源中,可以通过request将map中携带的数据再取出来!
    
    在ServletA中,往request的map中存入数据:
        request.setAttribute(String name, Object value);
        //将请求转发到ServletB
        request.getRequestDispatcher("ServletB的路径").forward(req,res);
    在ServletB中,可以通过request将map中的数据取出来:
        request.getAttribute(String name);
    

    Response

    1、实现请求重定向

    请求重定向(Redirect)的特点:
    1)重定向是两次请求两次响应
    2)重定向前后地址栏地址会发生变化
    3)进行重定向的两个资源没有限制,可以是同一个Web应用,也可以是不同的Web应用甚至可以是不同的服务器
    4)在重定向的过程中不可以通过request的map集合带数据到目的地
    实习请求重定向:
        response.sendRedirect("所重定向到资源的地址");
    
    实现定时刷新:
        response.getWriter().write("<h1>恭喜您注册成功,5秒后将会跳转到登录页面...</h1>");
        response.setHeader( "Refresh", "5;url=http://localhost:8080/CGB-Servlet-03/login.html" );
    
        定时刷新和重定向的特点几乎一致,唯一区别就是,重定向(转发)都是立即跳转,中间没有任何时间间隔,定时刷新可以指定多少秒之后再进行跳转, 在跳转之前, 可以输出信息提示用户(例如注册成功后的提示:恭喜您注册成功,5秒后将会跳转到登录页面...)
        


    16 声望8 粉丝

    « 上一篇
    HTTP协议
    下一篇 »
    MySQL