Servlet学习——分析一牛同事的代码

原创 2007年10月10日 09:48:00
 
业务需求:一管理系统,系统架构是struts+sping+hibernate,客户在页面上点击一按钮,触发一个发送E-mail的操作。Email的内容是html的格式,内容不是死的,但有一个模板。
 
解决思路:
其一,读入这个模板的html源代码,把需要动态显示的部分分别用特殊的代码做标记,然后在后台把这些特殊的标记用该显示的内容替换。这样做的缺点,如果动态显示的内容较多,需要做多个特殊标记,引起代码混乱,也不便于以后的维护。
其二,把这个模板作为一个jsp页面,发送email的时候,先生成这个jsp页面,当然这个页面不在前台显示,然后把这个jsp页面转换为html文件。然后在读取这个html文件作为email的内容发送。这样做方法一的所有缺点都不存在了。但是如何把一个jsp在后台转换为一个html文件,是一个难点。一较猛同事给出了如下方法,我在这事后诸葛亮,给大家做个分析,共同学习。
    /** *//**
     * 
@param jspFile jsp文件路径
     * 
@param htmlFile 要输出的html文件的路径
     * @add  2007/08/30
     
*/

     
public  void convertJspToHtml(HttpServletRequest request,
                HttpServletResponse response, String jspFile, String htmlFile)
                
throws ServletException, IOException ...{

            String url 
= jspFile;
            String name 
= htmlFile;
            ServletContext servletContext 
= request.getSession()
                    .getServletContext();
            //生成一个特定于jsp的RequestDispatcher对象,以用来对jsp传送请求信息.

            RequestDispatcher requestDispatcher 
= servletContext
                    .getRequestDispatcher(url);
            
/**//*new这个ByteArrayOutputStream的作用在于它有一个writeTo(OutputStream out)方法.
               用于将此字节数组输出流的全部内容写入到指定的输出流参数中.
*/

            
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            
            
//实现了servlet.ServletOutputStream抽象类的write方法,用于把响应信息写入到刚new的byteArrayOutputStream中.
            /**//*只是不知道为什么要实现这两个write方法*/
            
final ServletOutputStream servletOutputStream = new ServletOutputStream() ...{
                
public void write(byte[] data, int offset, int length) ...{
                    byteArrayOutputStream.write(data, offset, length);
                }


                
public void write(int b) throws IOException ...{
                    byteArrayOutputStream.write(b);
                }

            }
;
            
            
//new一个PrintWriter,连接到刚new的byteArrayOutputStream中
            final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
                    byteArrayOutputStream));
            
            
//重写了servlet.HttpServletResponseWrapper类的两个方法
            HttpServletResponse res = new HttpServletResponseWrapper(response) ...{
                
//此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。
                public ServletOutputStream getOutputStream() ...{
                    
return servletOutputStream;
                }

                
//此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。
                
//PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。
                public PrintWriter getWriter() ...{
                    
return printWriter;
                }

            }
;
            requestDispatcher.include(request, res);
            printWriter.flush();
            FileOutputStream fos 
= new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
            byteArrayOutputStream.writeTo(fos);
            fos.close();
        }

 

 

/*在这学习一下RequestDispatcher,它有两个方法,forward(ServletRequest request, ServletResponse response)
             和include(ServletRequest request, ServletResponse response),都是用与servlet之间的通讯.
            .forward()方法:
            被用来从这个Servlet向其它服务器资源传递请求。
            当一个Servlet对响应作了初步的处理,并要求其它的对象对此作出响应时,可以使用这个方法。
           
            request对象被传递到目标对象时,请求的URL路径和其他路径参数会被调整为反映目标对象的目标URL路径。
           
            如果已经通过响应返回了一个ServletOutputStream对象或PrintWriter对象,这个方法将不能使用,
            否则,这个方法会抛出一个IllegalStateException
           
            我的理解:用于一个servlet向目标servlet的单向通讯.
           
            2.include()方法:
            用来包括发送给其他服务器资源的响应的内容。本质上来说,这个方法反映了服务器端的内容。
           
            请求对象传到目标对象后会反映调用请求的请求URL路径和路径信息。
             这个响应对象只能调用这个ServletServletOutputStream对象和PrintWriter对象。
           
             一个调用includeServlet不能设置头域,如果这个Servlet调用了必须设置头域的方法(例如cookie),
             这个方法将不能保证正常使用。作为一个Servlet开发者,你必须妥善地解决那些可能直接存储头域的方法。
             例如,即使你使用会话跟踪,为了保证session的正常工作,你必须在一个调用includeServlet之外开始你的session
            
             我的理解:用于两个servlet之间的双向通讯.
            */
 
 /*public abstract class ServletOutputStream extends OutputStream
            这是一个由Servlet引擎使用的抽象类。Servlet通过使用ServletResponse接口的使用获得了对一个这种类型的对象的说明。
            利用这个输出流可以将数据返回到客户端。
           
            这个类的子类必须提供一个向OutputStream接口写入有关信息的方法。
            在这个接口中,当一个刷新或关闭的方法被调用时。所有数据缓冲区的信息将会被发送到客户端,也就是说响应被提交了。
            请注意,关闭这种类型的对象时不一定要关闭隐含的socket流。*/
 
 
/*
             public PrintWriter(OutputStream out)
             根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter
             此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。
             */
/*public class ServletResponseWrapper
            extends java.lang.Object
            implements ServletResponse
           
            Provides a convenient implementation of the ServletResponse interface t
            hat can be subclassed by developers wishing to adapt the response from a Servlet.
            This class implements the Wrapper or Decorator pattern.
            Methods default to calling through to the wrapped response object.*/
 
我做了如下修改也可以
    public  void convertJspToHtml(HttpServletRequest request,
            HttpServletResponse response, String jspFile, String htmlFile)
            
throws ServletException, IOException ...{

        String url 
= jspFile;
        String name 
= htmlFile;
        ServletContext servletContext 
= request.getSession()
                .getServletContext();
        
//生成一个特定于jsp的RequestDispatcher对象,以用来对jsp传送请求信息.
        RequestDispatcher requestDispatcher = servletContext
                .getRequestDispatcher(url);
        
/**//*new这个ByteArrayOutputStream的作用在于它有一个writeTo(OutputStream out)方法.
           用于将此字节数组输出流的全部内容写入到指定的输出流参数中.
*/

        
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        
        
//实现了servlet.ServletOutputStream抽象类的write方法,用于把响应信息写入到刚new的byteArrayOutputStream中.
        final class ServletOutputStream ...{
            
public void write(byte[] data, int offset, int length) ...{
                byteArrayOutputStream.write(data, offset, length);
            }


            
public void write(int b) throws IOException ...{
                byteArrayOutputStream.write(b);
            }

        }
;
        
        
//new一个PrintWriter,连接到刚new的byteArrayOutputStream中
        final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
                byteArrayOutputStream));
        
        
//重写了servlet.HttpServletResponseWrapper类的两个方法
        HttpServletResponse res = new HttpServletResponseWrapper(response) ...{
            
//此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。
//            public ServletOutputStream getOutputStream() {
//
                return servletOutputStream;
//
            }
            
//此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。
            
//PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。
            public PrintWriter getWriter() ...{
                
return printWriter;
            }

        }
;
        requestDispatcher.include(request, res);
        printWriter.flush();
        FileOutputStream fos 
= new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
        byteArrayOutputStream.writeTo(fos);
        fos.close();
    }

Android开发技术-笔试面试题分析一

-
  • 1970年01月01日 08:00

把别人比较好的代码打印出来仔细研究是一种比较好的学习方法

把别人比较好的代码打印出来仔细研究是一种比较好的学习方法好处:1、方便携带的纸张使你随时可以拿出来分析别人是怎么写程序的,从中得到所要的东西2、反复的查看可加深你的记忆,达到熟能生巧的效果,使以后开发...
  • itclock
  • itclock
  • 2005-10-05 03:48:00
  • 1118

Servlet深入学习,规范,理解和实现(中)——深入理解Tomcat(一)

心得:在写这篇博客之前,我大致阅读一些关于Tomcat的书籍和博客等资料,有些资料由于时间的关系,讲解的Tomcat版本太老,有些资料可以很好的说明Tomcat整理结构和设计思想但是很多重要的问题因为...
  • Zerohuan
  • Zerohuan
  • 2016-02-26 21:45:31
  • 5660

servlet学习代码

  • 2009年01月17日 21:15
  • 3.71MB
  • 下载

多个请求使用同一个Servlet

多个请求使用同一个Servlet 如果JSP中一个请求对应一个Servlet那要建很多Servlet,代码冗余较多。 我们可以把一个模块的请求封装在一个Servlet,实现功能的模块化,从而简化代码。...
  • HLK_1135
  • HLK_1135
  • 2016-12-15 23:25:13
  • 469

写给同事的前端学习路线<转>

写给同事的前端学习路线  高等游民白乌鸦 2014-02-14 18:07:09 前端要学习三个部分:HTML,CSS,JavaScript(简称JS),因此首先明确三个概念: ...
  • jkjlovezy_4
  • jkjlovezy_4
  • 2015-02-12 18:00:22
  • 380

Java Web学习总结(五)——Servlet开发(一)

点击上方“Java团长”,选择“置顶公众号”技术文章第一时间送达!上一篇:Java Web学习总结(四)——Http协议一、Servlet简介  Servlet是sun公司提供的一门用于开发动态web...
  • FYGu18
  • FYGu18
  • 2018-03-13 00:00:00
  • 289

一招出牛片:PHOTOSHOP数码摄影后期处理技法 pdf电子书

  • 2015年10月22日 17:02
  • 21.22MB
  • 下载

2017年最牛的Java编码套路【学习资料含源码】,免费领取就在今天!

重点在文末!!!TIOBE编程语言社区发布了 2017年12 月排行榜,Java、C、C ++ 三门编程语言依然占据前三,Java老大地位不可撼动啊!TIOBE编程语言社区排行榜 12 月编程语言排行...
  • b644ROfP20z37485O35M
  • b644ROfP20z37485O35M
  • 2017-12-24 00:00:00
  • 437

用Intellijidea建立简单javaWeb以及Servlet的步骤

主要跟着这个帖子中的步骤来的: http://blog.csdn.net/u012532559/article/details/51013400 但这个帖子中缺少了一步加servlet包的过程,ser...
  • mizaoyu
  • mizaoyu
  • 2016-12-01 15:43:18
  • 151
收藏助手
不良信息举报
您举报文章:Servlet学习——分析一牛同事的代码
举报原因:
原因补充:

(最多只允许输入30个字)