A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

                      servlet快速入门
                                          
1.什么是servlet
      在server上运行的 用JAVA语言编写的一段小程序。
          作用:接收到用户的请求,处理请求,把结果 以响应的 形式返回给client。       
          
2.应用程序的体系结构
        2.1 C/S 结构(Client/Server-DB)
              Client:需要安装特定的软件,维护麻烦
              界面修改: 只要安装的部分发生修改,都要重新升级 如果发生升级有可能就会带来相应的培训任务          
            2.2 B/S 结构(Browser/Server)  
                       界面放到服务器,借助于浏览器遵循http协议。
                           客户端不需要安装特定的软件,客户端的维护量降低,如果view/service修改就直接在服务器上修改就行了。
                移动端 一般都是C/S  企业级的应用开发一般都是B/S的

3.tomcat
      tomcat是apache组织提供的开源web服务器。www.apache.org
      javaEE规范:开发者和server厂商  都必须遵循。
    配置:  1)必须以来jdk的环境变量:JAVA_HONE   jdk的安装根路径
            2)http的端口,8080默认(如果安装oracle数据库会被占用,需要修改端口号)
                   修改端口:tomcat的安装根路径/conf/server.xml
                    <Connector port="8989" protocol="HTTP/1.1"
                                           connectionTimeout="20000"
                                           redirectPort="8443" />
                  建议修改之前做备份:一个开发人员的良好习惯,修改之前做备份

    启动:
                双击 tomcat根目录-->bin-->startup.bat(window)    startup.sh(linux)。
                   在黑窗口查看         1) 没异常信息
                                                    2) 找“信息: Starting Coyote HTTP/1.1 on http-8989” 启动成功 (8989是修改后的端口号)
                                                    3) 找“信息: Server startup in 393 ms” (启动时间)        
             注意:tomcat在同一个服务器上只能启动一次
                         
4.servlet
     在服务器上运行的java语言编写的小程序,用于接受client请求(一般包括url和用户的数据),
         并且对 cilent的请求进行处理,把结果以响应的形式返回cilent。(如果返回IE应该是返回的标准的html)

       4.1、写代码
                1) implements Servlet  必须实现接口中的所有方法
                2) extends GenericServlet(抽象类)  必须实现父类中的所有抽象方法(service方法)只有一个抽象方法
                     abstract  void| service(ServletRequest req, ServletResponse res)
                3) extends HttpServlet(也是抽象类,定义成抽象类是不让new对象) 覆盖父类的service方法                 

            public void service(HttpServletRequest request, HttpServletResponse response)
                                throws IOException, ServletException{     //为什么会有io异常,servlet处理完后以流的形式返回  ServletException不是和协议相关的异常
                                //1、设置响应类型  服务器处理完成后以什么类型返回。和响应相关。
                                response.setContentType("text/html");
                                //2、获取输出流
                                PrintWriter out = response.getWriter();
                                //3、使用输出流
                                                out.println("<html>");
                                out.println("<head><title>xxx</title></head>");
                                out.println("<body>");
                                Date date=new Date();
                                out.println("new"+date);
                                out.println("</body>");
                                out.println("</html>");
                                //out.close()  servlet会自动调用所以不用手动关闭
                                out.flush();   //PrintWriter  是缓冲流 所以清除先缓冲就可以了
                        }
                     注意:在 JavaProject 中,必须导入 servlet-api.jar 。
                                         
                把server上不能直接运行的类,变成可以通用IE直接访问的类。
                web.xml (web应用的部署描述符文件)
                        <!-- 配置servlet-->
                        <servlet>
                                <servlet-name>别名,在同一个web应用中 唯一</servlet-name>
                                <servlet-class>指定servlet的全类名  包结构</servlet-class>
                        </servlet>
                       
                        <!-- 配置servlet的映射-->
                        <servlet-mapping>
                                <servlet-name>别名,必须同servlet标签中的一致</servlet-name>
                                <url-pattern>访问servlet的url地址格式,必须以/开头</url-pattern>
                        </servlet-mapping>       
5.乱码问题
     解决响应内容中的中文乱码:
                response.setCharacterEncoding("GBK");

           响应设置编码格式:   Response.setContentType("text/html,Charset=utf-8");
                                                Response.setCharacterEncoding("utf-8");

           请求设置编码格式: //post请求:  Request.setCharacterEncoding("utf-8");
                                                          //get请求:       
                                                                        String parameter = Request.getParameter("name");
                                                                                        byte[] bytes = parameter.getBytes("iso-8859-1");
                                                                                        String name = new String(bytes, "utf-8");       

6.servlet通讯
     1、include 包含   在一个servlet中要包含另外一个servlet的结果。
                应用场景:动态网页的 复用。同一个网站的每个页面的logo图片(可以每个页面都写一个img 但是修改麻烦)
               
                步骤一:创建公共页面 LogoServlet
                        <img src="/web应用名/子目录/xx.gif"/>
                步骤二:在其它页面中,包含公共页 (分清哪个是包含哪个是被包含)
                    //获取请求分发对象
                    RequestDispatcher rd = request.getRequestDispatcher("/url-pattern");  
                        //包含
                        rd.include(request, response);        
        ----------------------------------------------------               
         2、forward 请求转发【重点】
                原则:显示(界面) 和 功能(逻辑) 分离。
               
                步骤一:创建 功能Servlet (LoginAction)
                        // 1 获取client数据
                        // 2 调用业务类的方法,实现xx功能
                        // 3 根据结果,
                            如果跳转到html的路径:"/子目录/xx.html"
                                如果跳转到servlet
                                RequestDispatcher rd = request.getRequestDispatcher("/url-pattern");//获取请求转发对象 显式servlet的url-pattern                               
                                rd.forward(request, response);
                                       
                步骤二:创建 显示Servlet (OkView ErrorView)
                        // 1设置响应类型
                        // 2获取输出流
                        // 3使用输出流
               
                跳转的同时,共享数据,
                  在逻辑servlet中获取数据 在显式servlet中想使用  需要在逻辑servlet中添加servlet中添加如下代码。       
                  
                  往request中设置值(命名属性):
                          request.setAttribute(str, obj);
                  在显示Servlet中,获取requet中的命名属性:
                        Object obj = request.getAttribute(str);
               
                forward(请求转发)的特点:
                1) 服务器内部的跳转   (客户端不知道跳转)
                2) 共享同一个request对象
                3) 地址栏不变  (地址栏地址和内容不一致)
                4) 永久转向
                5) 只能转向同一web应用内资源

        通常的编码规范:逻辑servlet  LoginActionServlet
                        显式servlet  LoginViewServlet               
        --------------------------------------------------------------       
     3、重定向 sendRedirect【重点】
                是web开发中的 一种跳转方式。
               
                response.sendRedirect("/web应用名/url-pattern");
                response.sendRedirect("/web应用名/子目录/xx.html");
               
                sendRedirect的特点:
                1) client的跳转
                2) 不共享 同一个request 对象
                3) 地址栏改变
                4) 永久跳转
                5) 可以转向 站外 资源
               
                forward 和 sendRedirect的应用场景:
                1) 功能Servlet中的数据 转到 显示Servlet后,还需要使用时,必须使用 forward;
                2) 除此以外,sendRedirect 优先。
               
7常见问题
    7.1、404 请求资源无效
                        原因: 1) url地址栏写错,重点检查 web应用名 和 url-pattern
                                   2) web应用没部署
                                   3) 检查tomcat启动界面是否有异常(标签错误、配置中的全类名等等)
       404是服务器执行完客户端的请求以后,返回给客户端的一个关于执行结果的状态编码
          产生的原因:web服务器(容器)根据请求地址找不到对应资源,如:
                    1).输入的地址有误(应用名大小写不正确,名称拼写不正确)。
                                        2).web.xml文件中<servlet>和<servlet-mapping>中的两个<servlet-name>不一致。
                                        3).没有将工程部署到Tomcat的webapps下面。
                                        4).web工程部署时的结构没有遵循Servlet规范。
        7.2、405
                 405这个错误的产生原因是容器找不到Servlet方法来处理请求。  
                   1).service方法名写错,字母顺序不对或大小写错误。
                   2).Service方法参数类型与标准不一致,或参数顺序与标准不一致。一定是HttpServletRequest,然后是HttpServletResponse类型。
                   3).Service方法异常、返回值类型与标准不一致,一定是抛出ServletException、IOException.返回值类型是void。
        7.3、500
                原因:1) serlvet的源代码中出异常;
                        2) 检查servlet类在server上的路径和包结构是否正确。
           500的错误是请求的Servlet在执行service方法的过程中出现了错误,程序不能继续运行了。
                        1).Servlet没有继承HttpServlet或实现Servlet接口
                        2).Web.xml文件中写错,与真正的包名类名不符。
                        3).Servlet方法中的代码运行时抛出异常
        7.4、请求server后,IE没反应,提示"下载/另存为"
                原因:检查 response.setContentType("text/html"); 通常写成test/html 。
            (1).可能性一:text/html;charset=GBK中间分号写成逗号.
                        (2).可能性二:XML中配置信息出错.
                        (3).可能性三:如定义全局变量时,例:CONTENT_TYPED在以后所用中放在双引号之中.
                        (4).可能性四:当上面的text/html,charset中写错字符的时候,也会提示下载.               

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马