package test;
/**
* @本程序实现的是将JSP访问数据库的代码生成静态,当用户登录后就只能访问登录时数据库的内容,如果要访问最新内容必须重新登录
* @本程序用到了javaservlet中的ServletContext.
* @本程序可以将用户的session值保存下来,即使服务器停止了只要用户知道自己的登录怅号也可以访问页面.
* 赵书贤 创建于2005-7-22
*/
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class toHtml extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*==============================================================================================*/
/**
* @设置session为true
* @取得session值
*/
HttpSession session = request.getSession(true);
String session_username = (String)session.getAttribute("session_username");
System.out.println("session_username="+session_username);
String session_username_type =(String) session.getAttribute("session_username_type"); //用户类型
System.out.println("session_username_type="+session_username_type);
/*=========================================================================================*/
/**
* @取得文件名
* @那个路径不好弄...郁闷...
*/
String url="";
String name="";
/**
* @javax.servlet.ServletContext 即SERVLET的.getServletContext()
* @这个对象在应用程序的整个生命周期间都有效,存放在这个对象内的数据任何Web组件都能访问到.
*/
ServletContext sc = getServletContext();
/**
* @file_name为将要访问的jsp文件,这个参数是从前面得到的参数.如index.jsp
* @则你访问这个servlet时加参数.如http://localhost/toHtml?file_name=index
* @这个参数可以直接从前面传过来.
*/
String file_name = request.getParameter("file_name")==null?"":request.getParameter("file_name");
System.out.println("file_name="+file_name);
/**
* ServletContext的路径一定要加"/"相对于当前路径
* @url为将要生成静态页面的 jsp文件如:http://localhost/index.jsp的执行结果.
* @name为生成后的htm文件名及保存位置.
* @name是根据用户登录的用户名来作为文件名保存.
*/
url = "/"+file_name+".jsp";
name="./doc/xxzx/"+session_username+file_name+".htm";
/**
* @使用RequestDispatcher重定向而不用redirect主要是因为前面的可以将form传给目标URL,而后者能.
* @dispatcher类型对应了RequestDispatcher.forward方法,而redirect类型则是HttpServletResponse.sendRedirect方法.
* @但是forward方法确实是不会使得其参数中包含的URL在IE地址栏中显示出来的,在下面一个地方这个东东让我忙了很久的.
*/
RequestDispatcher rd = sc.getRequestDispatcher(url);
/**
* @ByteArrayOutputStream可以捕获内存缓冲区的数据,转换成字节数组,实现将数据从高层次的形式转化成低层次的形式.
* @public ByteArrayOutputStream()创建一个新的字节数组输出流。缓冲区初始容量为 32 字节, 必要时可增加其尺寸.
*
* @public synchronized void write(byte b[],int off,int len)
* @将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。参数:(b - 数据.off - 数据的起始偏移量.len - 写入的字节数.)
*
* @write(int)将指定字节写入该字节数组输出流。
*/
final ByteArrayOutputStream os = new ByteArrayOutputStream();
final ServletOutputStream stream = new ServletOutputStream()
{
public void write(byte[] data, int offset, int length)
{
os.write(data, offset, length);
}
public void write(int b) throws IOException
{
os.write(b);
}
};
/**
* @调用PrintWriter实现缓冲流中的内容写出到文件中去.
* @定义HttpServletResponse参数让其传到其它界面
*/
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
HttpServletResponse rep = new HttpServletResponseWrapper(response)
{
public ServletOutputStream getOutputStream()
{
return stream;
}
public PrintWriter getWriter()
{
return pw;
}
};
/**
* @RequestDispatcher的include()方法将把Request Dispatcher资源的输出包含到当前输出中
*/
rd.include(request, rep);
/**
* @flush()方法强制输出后刷新缓冲区,清空缓冲区.
*/
pw.flush();
//把jsp输出的内容写到xxx.htm
FileOutputStream fos = new FileOutputStream(name);
//把os的内部缓冲区写到fos文件中去.
os.writeTo(fos);
fos.close();
PrintWriter out=response.getWriter();
out.print("<p align=center><font size=3 color=red>Success!Andrew</font></p>");
out.print("<p align=center><font size=3 color=red>"+session_username+file_name+"</font></p>");
/**
* @实现页面转向
* @让访问者直接生成的页面
* @response.sendRedirect(url)转址会在地址栏中显示目标URL值.
*/
//HttpServletResponse.sendRedirect("./"+session_username+".htm");
response.sendRedirect("./"+session_username+file_name+".htm");
/*==============这个转向不会在地址栏显示目标URL===================*/
// RequestDispatcher rdo = getServletContext().getRequestDispatcher("/"+session_username+".htm");
//rdo.forward(request, response);
/*===============================================*/
}
}
/**
* @本程序实现的是将JSP访问数据库的代码生成静态,当用户登录后就只能访问登录时数据库的内容,如果要访问最新内容必须重新登录
* @本程序用到了javaservlet中的ServletContext.
* @本程序可以将用户的session值保存下来,即使服务器停止了只要用户知道自己的登录怅号也可以访问页面.
* 赵书贤 创建于2005-7-22
*/
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class toHtml extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
/*==============================================================================================*/
/**
* @设置session为true
* @取得session值
*/
HttpSession session = request.getSession(true);
String session_username = (String)session.getAttribute("session_username");
System.out.println("session_username="+session_username);
String session_username_type =(String) session.getAttribute("session_username_type"); //用户类型
System.out.println("session_username_type="+session_username_type);
/*=========================================================================================*/
/**
* @取得文件名
* @那个路径不好弄...郁闷...
*/
String url="";
String name="";
/**
* @javax.servlet.ServletContext 即SERVLET的.getServletContext()
* @这个对象在应用程序的整个生命周期间都有效,存放在这个对象内的数据任何Web组件都能访问到.
*/
ServletContext sc = getServletContext();
/**
* @file_name为将要访问的jsp文件,这个参数是从前面得到的参数.如index.jsp
* @则你访问这个servlet时加参数.如http://localhost/toHtml?file_name=index
* @这个参数可以直接从前面传过来.
*/
String file_name = request.getParameter("file_name")==null?"":request.getParameter("file_name");
System.out.println("file_name="+file_name);
/**
* ServletContext的路径一定要加"/"相对于当前路径
* @url为将要生成静态页面的 jsp文件如:http://localhost/index.jsp的执行结果.
* @name为生成后的htm文件名及保存位置.
* @name是根据用户登录的用户名来作为文件名保存.
*/
url = "/"+file_name+".jsp";
name="./doc/xxzx/"+session_username+file_name+".htm";
/**
* @使用RequestDispatcher重定向而不用redirect主要是因为前面的可以将form传给目标URL,而后者能.
* @dispatcher类型对应了RequestDispatcher.forward方法,而redirect类型则是HttpServletResponse.sendRedirect方法.
* @但是forward方法确实是不会使得其参数中包含的URL在IE地址栏中显示出来的,在下面一个地方这个东东让我忙了很久的.
*/
RequestDispatcher rd = sc.getRequestDispatcher(url);
/**
* @ByteArrayOutputStream可以捕获内存缓冲区的数据,转换成字节数组,实现将数据从高层次的形式转化成低层次的形式.
* @public ByteArrayOutputStream()创建一个新的字节数组输出流。缓冲区初始容量为 32 字节, 必要时可增加其尺寸.
*
* @public synchronized void write(byte b[],int off,int len)
* @将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。参数:(b - 数据.off - 数据的起始偏移量.len - 写入的字节数.)
*
* @write(int)将指定字节写入该字节数组输出流。
*/
final ByteArrayOutputStream os = new ByteArrayOutputStream();
final ServletOutputStream stream = new ServletOutputStream()
{
public void write(byte[] data, int offset, int length)
{
os.write(data, offset, length);
}
public void write(int b) throws IOException
{
os.write(b);
}
};
/**
* @调用PrintWriter实现缓冲流中的内容写出到文件中去.
* @定义HttpServletResponse参数让其传到其它界面
*/
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
HttpServletResponse rep = new HttpServletResponseWrapper(response)
{
public ServletOutputStream getOutputStream()
{
return stream;
}
public PrintWriter getWriter()
{
return pw;
}
};
/**
* @RequestDispatcher的include()方法将把Request Dispatcher资源的输出包含到当前输出中
*/
rd.include(request, rep);
/**
* @flush()方法强制输出后刷新缓冲区,清空缓冲区.
*/
pw.flush();
//把jsp输出的内容写到xxx.htm
FileOutputStream fos = new FileOutputStream(name);
//把os的内部缓冲区写到fos文件中去.
os.writeTo(fos);
fos.close();
PrintWriter out=response.getWriter();
out.print("<p align=center><font size=3 color=red>Success!Andrew</font></p>");
out.print("<p align=center><font size=3 color=red>"+session_username+file_name+"</font></p>");
/**
* @实现页面转向
* @让访问者直接生成的页面
* @response.sendRedirect(url)转址会在地址栏中显示目标URL值.
*/
//HttpServletResponse.sendRedirect("./"+session_username+".htm");
response.sendRedirect("./"+session_username+file_name+".htm");
/*==============这个转向不会在地址栏显示目标URL===================*/
// RequestDispatcher rdo = getServletContext().getRequestDispatcher("/"+session_username+".htm");
//rdo.forward(request, response);
/*===============================================*/
}
}