Servlet路径、ServletConfig、ServletContext和乱码问题(转载)

来源:互联网 发布:搜索引擎优化的优缺点 编辑:程序博客网 时间:2024/05/02 02:26

一、MIME类型:
      告诉客户端以什么方式接收,如果写错了,则以下载方式接收
二、两个小技巧
      1、让生产的class文件直接保存在web应用的classes目录下:
       构建路径----输出文件夹......
      2、资源文件(properties)直接在src目录下建立,那么Eclipse会自动在输出目录下
      生成此文件(比如在classes文件夹下生成my.properties)
三、路径问题
      1、加斜杠和不加斜杠的区别?
       a、加斜杠表示相对于根目录(tomcat的web应用的根目录webapps):
       如果你在客户端参数里加了斜杠,那么就要再走到当前目录下你的web应用下
       b、不加斜杠表示当前目录(当前文件,还包括了包名):如表单里action,只需要写urlPattern里去斜杠的路径,
       表单里提交的post信息跟url地址栏里一样都是要通过http请求提交到服务器的,再由服务器
       分析web.xml文件查找servlet路径

四、乱码问题
      首先要明白,乱码有两种:一种是从请求里接收的是乱码,一种是响应给客户端的是乱码
      1、response.setContentType("text/html;charset=gbk");
       :设置返回给客户端的MIME类型和返回的页面防止出现中文乱码
      2、request.setCharacterEncoding("gbk")
       :设置获取request里的参数为gbk,防止获取乱码
        注意顺序:先设置,后获取
      3、还有对于request.setCharacterEncoding("gbk"),只能解决获取post方式的,
      而不能解决获取get方式的....我们在doPost里调用doGet,其实就是解决了post方式
      至于get方式....待续
      为什么对get方式无效?
      因为此方法setCharacterEncoding("gbk")只对请求的消息体有效,而get方式是在请求的请求行里

五、以下几个比较重要的方法:
      1、从资源文件里读取信息并输出
       步骤:
       a、在src下建立资源文件,这样会自动保存到输出文件夹(比如classes)里
       b、//通过类模板获取一个输入流,从classes目录开始查找
        //通过类模板,原理就在于通过类去找文件,而不依赖于绝对路径,这样移植之后不用改代码
        InputStreamin =MyServlet.class.getResourceAsStream("/txt/my.properties")
       c、pro.load(in) //从输入流里加载资源文件
       d、out.print(pro.getProperty(key)) //通过键获取值,并打印
       注意:如果使用系统路径会出错
        System.getProperty("user.dir")
        这样得到的是tomcat的bin目录,因为服务器启动是从这里开始

 2、servlet的配置对象:ServletConfig
       首先,要了解一点,web容器解析完请求和相应之后,把所以的信息都放在ServletConfig对象里
       从web.xml里读取配置信息,主要是读取<init-param>初始化信息
       并且要清楚,ServletConfig只为一个Servlet服务,这是局部的
       例子:
       
       //自己本身就从父类继承了getServletConfig()这个方法,所以直接用this获取
       ServletConfigconfig = this.getServletConfig();
       //获取初始化参数
       Stringinfo = config.getInitParameter("paramname");
       out.print(info+"<br/>");
       在web.xml里:
       <servlet>
        <init-param>
         <param-name>paramname</param-name>
         <param-value>paramvalue</param-value>
        </init-param>
        <servlet-name>name</servlet-name>
        <servlet-class>com.lovo.SecondServlet</servlet-class>
       </servlet>
       注意:只对当前这个servlet有效
      
      3、全局上下文对象:ServletContext
       对所有的servlet有效,类似于全局变量,web.xml中写在<web-app>根节点下
       可以从当前类(this)里获取getServletContext()方法,也可以从Config对象里获取
       例:
       
       ServletContextcontext = this.getServletContext();
       info= context.getInitParameter("paramname");
       out.print(info);
       web.xml里
       <web-app>
        <context-param>
         <param-name>paramname</param-name>
         <param-value>paramvalue</param-value>
        </context-param>
       </web-app>
      4、将相对路径变成绝对(物理)路径,即硬盘上的路径
       全局上下文对象的ServletContext的getRealPath方法
       例:
       info= context.getRealPath("/img/lv.jpg");
       out.print("物理路径:"+info);
       img文件夹在我们建的web应用下myweb/img/lv.jpg

 5、从内存中设置和获取全局属性对象(字符串也可以):setAttribute()----getAttribute()
       首先明白,底层是map集合
       回忆,我们在做通讯服务器项目的时候,在request对象里解析客户端请求,并且封装到map里
       所以就是在从request里获取
       注意了:request里有这两个属性,上下文对象里也有这两个属性,要全局上下文里的才能被全局
       访问,才能作为聊天室原理
       例子:
       request.setAttribute("str","myStr"); //可以是字符串
       Listlist = new ArrayList();
       list.add("bitch");
       list.add("shit");
       list.add("fuck");
       request.setAttribute("mylist",list); //也可以是对象
       out.print(request.getAttribute("str")+"<br>");
       out.print(request.getAttribute("mylist"));
       注:所谓的全局,也就是在任何一个servlet里都可以设置和取出,并可以设置很多键值对,这也就是聊天室原理!
六、注意在注册第二个servlet时,<servlet>和<servlet-mapping>都是重新写的,并且区分<servlet-name>

七、再次理解web服务器的启动和servlet的生命周期
      1、首先,服务器启动,加载所有的web应用
      2、web容器实例化servlet,可以在web.xml配置load-on-startup:
       服务器启动时就创建servlet实例(正数)或者是第一次接收到请求时才创建(负数或不写)?
      3、web容器触发init方法装载资源
      4、service.....调用其它如doGet、doPost方法
      5、destroy,销毁servlet

八、最后,ServletConfig和ServletContext的关系


出处http://blog.sina.com.cn/s/blog_4b5bc0110100fyxs.html

原创粉丝点击