zoukankan      html  css  js  c++  java
  • Servlet常用操作(基础)

    ----------------------------------------------------------------------------------------------
    [版权申明:本文系作者原创,转载请注明出处] 
    文章出处:http://blog.csdn.net/sdksdk0/article/details/51953305
    作者:朱培      ID:sdksdk0      邮箱: zhupei@tianfang1314.cn   

    --------------------------------------------------------------------------------------------

    本文主要介绍servlet的基本使用操作,是一些非常基础的知识,主要掌握servlet作用域、servlet映射、请求转发、ServletConfig配置、ServletContext等的使用,最后以一个简易的文件下载的案例来说明Servlet的应用。

    一、简介

     

    Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
    最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。servlet是运行在web服务器中的小型java程序,通过HTTP接收和响应web客户端的请求。

    Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。因为是对象字节码,可动态地从网络加载,可以说 Servlet 对 Server 就如同 Applet对 Client 一样,但是,由于 Servlet 运行于 Server 中,它们并不需要一个图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。

    二、编码步骤

     

    1、编码一个类,实现javax.servlet.Servlet接口或者继承javax.servlet.GenericServlet

    public class HelloServlet extends GenericServlet{
         public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{
            res.getOutputStream().write("hello world".getBytes());
         }
    }
    

    2、配置一个servlet。web.xml中

    <!--声明一个servlet -->
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>cn.tf.servlet.HelloServlet</servlet-class>
    
    </servlet>
    
    <!--  给servlet映射一个url地址 -->
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    
    </servlet-mapping>
    

    3、把应用部署到Tomcat中,之后才可以看到效果。

    三、执行过程

     
    • 1、通过浏览器输入网址访问tomcat,
    • 2、然后在tomcat中访问该应用
    • 3、找到了这个应用的web.xml()
    • 4、在web.xml中找到叫做/hello的映射
    • 5、在web.xml中找到servlet-name:HelloServlet()
    • 6、找到对应的类HelloServlet.class:先从应用的class目录、应用的lib中的jar包、Tomcatlib目录中所有的jar包这个顺序进行查找。 实例化servlet对象,接着调用init方法、第一次访问时调用.

    • 7、有Tomcat调用该类的servlet方法

    • 8、浏览器界面响应。

    四、生命周期

     

    实例化对象,第一次访问时调用.

    init() 一旦初始化完成,该实例就一直保持在Tomcat的内存中,第一次访问时调用.。

    getServletInfo() 返回作者、版权等信息。

    service() 用户每次请求都会执行。

    destroy() 关闭tomcat的时候调用。

     

    加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。

    public class ServletDemo2 implements Servlet {
    
    public ServletDemo2(){
        System.out.println("调用了servletDemo2的构造方法"); 
    }
    
    //初始化
    @Override
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("调用了init方法");
    }
    
    //获取servlet配置的方法
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    //返回作者,版权等信息
    @Override
    public String getServletInfo() {
        return null;
    }
    //服务器方法
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("执行了service方法");
    }
    //销毁方法
    @Override
    public void destroy() {
        System.out.println("服务器被销毁");
    }
    }
    

     

    通过web.xml让servlet在Tomcat加载应用时,就完成实例化和初始化。

    <load-on-startup>2</load-on-startup>

     

    GenericServlet和HttpServlet的对比

    从大到小:servlet、GenericServlet、HttpServlet myeclipse默认的是继承HttpServlet。这个时候不需要覆盖service方法。继承了doGet、doPost方法。

    五、servlet映射细节

     

    映射地址:多个不同的地址可以映射到同一个servlet.

    通配符映射:*匹配所有字符串 url-pattern:

    1. .do   以开头,以某个字符串结尾。
    2. /action/*   以前缀开头,以*结尾。
    3. /*   匹配所有。

    匹配原则: 绝对匹配: /开头的批评 扩展名结尾的 (优先级高->低).

    默认的servlet:一个servlet的url-pattern为一个/,那么这个servlet就是默认的servlet。

    线程安全

    对于单例对象:多线程就可能出现线程安全问题。 实现SingleThreadModel接口后,控制线程安全问题完全由服务器来决定。

    在servlet中尽量不要使用实例变量,应该要使用局部变量。

    六、ServletConfig配置

     

    将编码配置放到web.xml中。

      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    

    读取配置参数的值: ServletConfig

        String value=getServletConfig().getInitParameter("encoding");
    

    七、ServletContext

     

    1、 servletContext的实例就代表当前的javaweb应用。 一个javaweb只有一个servletContext的实例。当前应用中的其他资源(servlet、jsp、html等)共享同一个ServletContext.

    2、生命周期 应用被服务器加载时产生ServletContext实例。 生命周期是 从servletContext创建到服务器关闭

    3、获得ServletContext的引用

    ServletContext  sc=getServletContext();
    

    sc.setAttribute("a", "demo1"); Object value=sc.getAttribute("a");

    4、获得web应用的全局参数 在web.xml中配置

    <context-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </context-param>
    

    调用:

    ServletContext sc=config.getServletContext();
    sc.getInitParameter("encoding");
    

    5、servlet请求转发 从demo4转到demo3

    ServletContext sc=getServletContext();
        RequestDispatcher  dispatcher=sc.getRequestDispatcher("/servlet/Demo3");
        dispatcher.forward(request, response);
    

    6、读取配置文件

    ResourceBundle只适合读取properties文件,只能读取类路径中的配置文件,WEB-INF/class或者jar中的文件:

    ResourceBundle rb=ResourceBundle.getBundle("cn.tf.servletContext.c");
    

    ServletContext:String getRealPath(String path), 获取到文件的真实路径,只适合javaweb应用,能够读取其任何位置的任意文件:

    ServletContext sc=getServletContext();
        String path=sc.getRealPath("/WEB-INF/a.properties");
        System.out.println(path);
    
        Properties prop=new Properties();
        prop.load(new FileInputStream(path));
        System.out.println(prop.getProperty("key"));
    

    用类加载器:文件位置要在在类路径中,可以读取任意类型的文件,不适合读取大文件。

    ClassLoader cl=Demo5.class.getClassLoader();
        InputStream is=cl.getResourceAsStream("cn/tf/servletContext/c.properties");
    
        Properties prop=new Properties();
        prop.load(is);
        System.out.println(prop.getProperty("key"));

    八、文件下载(案例)

    1、我们先将图片1放置到项目的WEB-INF目录下
    2、我们需要得到文件的真实路径:
    ServletContext sc=getServletContext();
    		String path=sc.getRealPath("/WEB-INF/1.jpg");

    3、以流的方式进行读取
    OutputStream out=response.getOutputStream();
    		int len =-1;
    		byte b[] =new byte[1024];
    		
    		while((len=in.read(b))!=-1){
    			out.write(b,0,len);
    		}
    4、告知浏览器去下载这个文件
    response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
    		response.setHeader("Content-Type", "application/octet-stream");

    5、关闭流
    in.close();
    out.close();



     
     
    完整代码:
    //文件下载
    public class Demo6 extends HttpServlet {
    
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		//得到要下载的文件的真实路径
    		ServletContext sc=getServletContext();
    		
    		String path=sc.getRealPath("/WEB-INF/1.jpg");
    		
    		InputStream in=new FileInputStream(path);
    		
    		//告知浏览器去下载
    		response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
    		response.setHeader("Content-Type", "application/octet-stream");
    		
    		
    		OutputStream out=response.getOutputStream();
    		int len =-1;
    		byte b[] =new byte[1024];
    		
    		while((len=in.read(b))!=-1){
    			out.write(b,0,len);
    		}
    		in.close();
    		out.close();
    		
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		doGet(request,response);
    	}
    
    }
    


    源码下载:https://github.com/sdksdk0/ServletDemo

  • 相关阅读:
    为什么C/C++语言使用指针
    VS2010调试入门指南
    vs2010的11个调试技巧和方法
    排序算法一:快速排序
    Ubuntu下codeblocks汉化
    Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
    QQ通信原理及QQ是怎么穿透内网进行通信的?
    jackson中自定义处理序列化和反序列化
    Json解析工具Jackson(使用注解)
    jackSon注解– @JsonInclude 注解不返回null值字段
  • 原文地址:https://www.cnblogs.com/sdksdk0/p/6060036.html
Copyright © 2011-2022 走看看