《How Tomcat Works》学习笔记(二)
2015-11-09 16:09
627 查看
第二章主要是编写一个简单的servlet容器。
书中对Servlet中的一些接口和类进行了详细的解释。
通过书中的自己写一个可以访问静态资源和servlet的简单Servlet容器(从上一讲的拓展)
SocketTest
Request
Response
StaticResourceProcessor
ServletProcessor1
Constants
项目目录结构:
SocketTest
ServletProcessor
PrimitiveServlet(注意写在默认包内)
有没有觉得ServletProcessor类中看着有点晕,其实是用java中的反射调用PrimitiveServlet中的service方法
改写成下面的也可以:(主要是里面URLClassLoader,URLStreamHandler等等没有弄明白)
第一个应用程序有一个严重的问题。在ServletProcessor1类的process方法,你向上转换ex02.pyrmont.Request实例为javax.servlet.ServletRequest,并作为第一个参数传递给servlet的service方法。你也向下转换ex02.pyrmont.Response实例为javax.servlet.ServletResponse,并作为第二个参数传递给servlet的service方法这会危害安全性。知道这个servlet容器的内部运作的Servlet程序员可以分别把ServletRequest和ServletResponse实例向下转换为ex02.pyrmont.Request和ex02.pyrmont.Response,并调用他们的公共方法。拥有一个Request实例,它们就可以调用parse方法。拥有一个Response实例,就可以调用sendStaticResource方法。
添加二个类:
RequestFacade:
package com.test.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RequestFacade implements ServletRequest{
private ServletRequest request = null;
public RequestFacade(Request request)
{
this.request = request;
}
@Override
public Object getAttribute(String name) {
return request.getAttribute(name);
}
@Override
public Enumeration<String> getAttributeNames() {
return request.getAttributeNames();
}
@Override
public String getCharacterEncoding() {
return null;
}
@Override
public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
}
@Override
public int getContentLength() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return null;
}
@Override
public ServletInputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<String> getParameterNames() {
// TODO Auto-generated method stub
return null;
}
@Override
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, String[]> getParameterMap() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getProtocol() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getScheme() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServerName() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getServerPort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public BufferedReader getReader() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRemoteAddr() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRemoteHost() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setAttribute(String name, Object o) {
// TODO Auto-generated method stub
}
@Override
public void removeAttribute(String name) {
// TODO Auto-generated method stub
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<Locale> getLocales() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isSecure() {
// TODO Auto-generated method stub
return false;
}
@Override
public RequestDispatcher getRequestDispatcher(String path) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRealPath(String path) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getRemotePort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getLocalName() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getLocalAddr() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getLocalPort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return null;
}
@Override
public AsyncContext startAsync() {
// TODO Auto-generated method stub
return null;
}
@Override
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAsyncStarted() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAsyncSupported() {
// TODO Auto-generated method stub
return false;
}
@Override
public AsyncContext getAsyncContext() {
// TODO Auto-generated method stub
return null;
}
@Override
public DispatcherType getDispatcherType() {
// TODO Auto-generated method stub
return null;
}
}
ResponseFacade:
package com.test.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
public class ResponseFacade implements ServletResponse{
private ServletResponse response;
public ResponseFacade(Response response)
{
this.response = response;
}
@Override
public String getCharacterEncoding() {
return response.getCharacterEncoding();
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return null;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public PrintWriter getWriter() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setCharacterEncoding(String charset) {
// TODO Auto-generated method stub
}
@Override
public void setContentLength(int len) {
// TODO Auto-generated method stub
}
@Override
public void setContentType(String type) {
// TODO Auto-generated method stub
}
@Override
public void setBufferSize(int size) {
// TODO Auto-generated method stub
}
@Override
public int getBufferSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void flushBuffer() throws IOException {
// TODO Auto-generated method stub
}
@Override
public void resetBuffer() {
// TODO Auto-generated method stub
}
@Override
public boolean isCommitted() {
// TODO Auto-generated method stub
return false;
}
@Override
public void reset() {
// TODO Auto-generated method stub
}
@Override
public void setLocale(Locale loc) {
// TODO Auto-generated method stub
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
}
ServletProcessor修改一下:
Servlet servlet = null;
RequestFacade requestFacade = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);
try {
servlet = (Servlet) myClass.newInstance();
servlet.service((ServletRequest) requestFacade,(ServletResponse)responseFacade);
}
书中对Servlet中的一些接口和类进行了详细的解释。
通过书中的自己写一个可以访问静态资源和servlet的简单Servlet容器(从上一讲的拓展)
SocketTest
Request
Response
StaticResourceProcessor
ServletProcessor1
Constants
项目目录结构:
SocketTest
package com.test.test; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class SocketTest { //获取文件路径 private static final String SHUTDOWN="/SHUTDOWN"; private boolean shutdown = false; public static void main(String[] args) { SocketTest st = new SocketTest(); st.await(); } public void await() { ServerSocket serverSocket = null; int port = 8080; try { serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); }catch(Exception e) { e.printStackTrace(); System.exit(1); } while(!shutdown) { Socket socket = null; InputStream is = null; OutputStream os = null; try { socket = serverSocket.accept(); is = socket.getInputStream(); os = socket.getOutputStream(); Request request = new Request(is); request.parse(); Response response = new Response(os); response.setRequest(request); //判断请求的是静态资源还是servlet //处理servlet if(request.getUri().startsWith("/servlet/")) { ServletProcessor1 sp = new ServletProcessor1(); sp.process(request,response); }//处理静态资源 else { StaticResourceProcessor srp = new StaticResourceProcessor(); srp.process(request,response); } socket.close(); shutdown = request.getUri().equals(SHUTDOWN); }catch(Exception e) { e.printStackTrace(); System.exit(1); } } } }Request:
package com.test.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class Request implements ServletRequest{ private InputStream is; private String uri; public Request(InputStream is) { this.is = is; } public String getUri() { return this.uri; } public void parse() { StringBuffer sb = new StringBuffer(2048); byte[] buff = new byte[2048]; int length = -1; try { length = is.read(buff); }catch(Exception e) { e.printStackTrace(); } for(int i=0; i<length; i++) { sb.append((char)buff[i]); } System.out.println("request : "+sb.toString()); //解析 uri = parseUri(sb.toString()); } //请求头的格式GET /servlet/PrimitiveServlet HTTP/1.1 //返回的的是/servlet/PrimitiveServlet private String parseUri(String source) { int beginIndex,endIndex; beginIndex = source.indexOf(" "); if(-1 != beginIndex) { endIndex = source.indexOf(" ", beginIndex+1); if(endIndex > beginIndex) { return source.substring(beginIndex+1, endIndex); } } return null; } @Override public Object getAttribute(String name) { // TODO Auto-generated method stub return null; } @Override public Enumeration<String> getAttributeNames() { // TODO Auto-generated method stub return null; } @Override public String getCharacterEncoding() { // TODO Auto-generated method stub return null; } @Override public void setCharacterEncoding(String env) throws UnsupportedEncodingException { // TODO Auto-generated method stub } @Override public int getContentLength() { // TODO Auto-generated method stub return 0; } @Override public String getContentType() { // TODO Auto-generated method stub return null; } @Override public ServletInputStream getInputStream() throws IOException { // TODO Auto-generated method stub return null; } @Override public String getParameter(String name) { // TODO Auto-generated method stub return null; } @Override public Enumeration<String> getParameterNames() { // TODO Auto-generated method stub return null; } @Override public String[] getParameterValues(String name) { // TODO Auto-generated method stub return null; } @Override public Map<String, String[]> getParameterMap() { // TODO Auto-generated method stub return null; } @Override public String getProtocol() { // TODO Auto-generated method stub return null; } @Override public String getScheme() { // TODO Auto-generated method stub return null; } @Override public String getServerName() { // TODO Auto-generated method stub return null; } @Override public int getServerPort() { // TODO Auto-generated method stub return 0; } @Override public BufferedReader getReader() throws IOException { // TODO Auto-generated method stub return null; } @Override public String getRemoteAddr() { // TODO Auto-generated method stub return null; } @Override public String getRemoteHost() { // TODO Auto-generated method stub return null; } @Override public void setAttribute(String name, Object o) { // TODO Auto-generated method stub } @Override public void removeAttribute(String name) { // TODO Auto-generated method stub } @Override public Locale getLocale() { // TODO Auto-generated method stub return null; } @Override public Enumeration<Locale> getLocales() { // TODO Auto-generated method stub return null; } @Override public boolean isSecure() { // TODO Auto-generated method stub return false; } @Override public RequestDispatcher getRequestDispatcher(String path) { // TODO Auto-generated method stub return null; } @Override public String getRealPath(String path) { // TODO Auto-generated method stub return null; } @Override public int getRemotePort() { // TODO Auto-generated method stub return 0; } @Override public String getLocalName() { // TODO Auto-generated method stub return null; } @Override public String getLocalAddr() { // TODO Auto-generated method stub return null; } @Override public int getLocalPort() { // TODO Auto-generated method stub return 0; } @Override public ServletContext getServletContext() { // TODO Auto-generated method stub return null; } @Override public AsyncContext startAsync() { // TODO Auto-generated method stub return null; } @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) { // TODO Auto-generated method stub return null; } @Override public boolean isAsyncStarted() { // TODO Auto-generated method stub return false; } @Override public boolean isAsyncSupported() { // TODO Auto-generated method stub return false; } @Override public AsyncContext getAsyncContext() { // TODO Auto-generated method stub return null; } @Override public DispatcherType getDispatcherType() { // TODO Auto-generated method stub return null; } }Response:
package com.test.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Locale; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; public class Response implements ServletResponse{ private static final int BUFF_SIZE = 1024; private OutputStream os; private Request request; PrintWriter writer; public Response(OutputStream os) { this.os = os; } public void setRequest(Request request) { this.request = request; } public void sendStaticResource() { byte[] buff = new byte[BUFF_SIZE]; FileInputStream fis = null; try { File file = new File(Constants.WebRoot, request.getUri()); fis = new FileInputStream(file); int length = -1; while(-1 != (length = fis.read(buff))) { os.write(buff, 0, length); } }catch(Exception e) { String errorMessage = "HTTP/1.1 404 File Not Found\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 23\r\n" + "\r\n" + "<h1>File Not Found</h1>";; try { os.write(errorMessage.getBytes()); } catch (IOException e1) { e1.printStackTrace(); } }finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public String getCharacterEncoding() { // TODO Auto-generated method stub return null; } @Override public String getContentType() { // TODO Auto-generated method stub return null; } @Override public ServletOutputStream getOutputStream() throws IOException { // TODO Auto-generated method stub return null; } @Override public PrintWriter getWriter() throws IOException { writer = new PrintWriter(os, true); return writer; } @Override public void setCharacterEncoding(String charset) { // TODO Auto-generated method stub } @Override public void setContentLength(int len) { // TODO Auto-generated method stub } @Override public void setContentType(String type) { // TODO Auto-generated method stub } @Override public void setBufferSize(int size) { // TODO Auto-generated method stub } @Override public int getBufferSize() { // TODO Auto-generated method stub return 0; } @Override public void flushBuffer() throws IOException { // TODO Auto-generated method stub } @Override public void resetBuffer() { // TODO Auto-generated method stub } @Override public boolean isCommitted() { // TODO Auto-generated method stub return false; } @Override public void reset() { // TODO Auto-generated method stub } @Override public void setLocale(Locale loc) { // TODO Auto-generated method stub } @Override public Locale getLocale() { // TODO Auto-generated method stub return null; } }StaticResourceProcessor
package com.test.test; /** * 静态资源 * */ public class StaticResourceProcessor { public void process(Request request, Response response) { try { response.sendStaticResource(); }catch(Exception e) { e.printStackTrace(); } } }
ServletProcessor
package com.test.test; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandler; import javax.servlet.Servlet; public class ServletProcessor1 { public void process(Request request, Response response) { String fullName = request.getUri(); String servletName = fullName.substring(fullName.lastIndexOf("/")+1); System.out.println("servletName: "+servletName); URLClassLoader loader = null; try { URL[] urls = new URL[1]; URLStreamHandler streamHandler = null; File classPath = new File(Constants.WebRoot); // System.out.println("absolution: "+classPath.getAbsolutePath()); // // System.out.println("canon: "+classPath.getCanonicalPath()); String reposity = (new URL("file",null, classPath.getCanonicalPath()+File.pathSeparator)).toString(); urls[0] = new URL(null,reposity, streamHandler); loader = new URLClassLoader(urls); }catch(Exception e) { e.printStackTrace(); } try { Class<?> servletClass = loader.loadClass(servletName); Object obj = servletClass.newInstance(); Servlet servlet = (Servlet)obj; servlet.service(request, response); } catch (Exception e) { e.printStackTrace(); try { response.getWriter().println("<h1>Not Find Servlet</h1>"); } catch (IOException e1) { e1.printStackTrace(); } } } }
PrimitiveServlet(注意写在默认包内)
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class PrimitiveServlet implements Servlet{ @Override public void init(ServletConfig config) throws ServletException { System.out.println("*******init******"); } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("from service"); PrintWriter out = response.getWriter(); //System.out.println(out+"....."); out.println("Hello. Roses are red."); out.println("Violets are blue."); } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void destroy() { System.out.println("destroy...."); } }Constants
package com.test.test; import java.io.File; public class Constants { public static final String WebRoot=System.getProperty("user.dir")+File.separator+"WebContent"; }运行效果:
有没有觉得ServletProcessor类中看着有点晕,其实是用java中的反射调用PrimitiveServlet中的service方法
改写成下面的也可以:(主要是里面URLClassLoader,URLStreamHandler等等没有弄明白)
package com.test.test; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandler; import javax.servlet.Servlet; public class ServletProcessor1 { public void process(Request request, Response response) { String fullName = request.getUri(); String servletName = fullName.substring(fullName.lastIndexOf("/")+1); System.out.println("servletName: "+servletName); try { Class<?> clazz = Class.forName(servletName); Servlet servlet = (Servlet)clazz.newInstance(); servlet.service(request, response); } catch (Exception e) { e.printStackTrace(); try { response.getWriter().println("<h1>Not Find Servlet</h1>"); } catch (IOException e1) { e1.printStackTrace(); } } } }
第一个应用程序有一个严重的问题。在ServletProcessor1类的process方法,你向上转换ex02.pyrmont.Request实例为javax.servlet.ServletRequest,并作为第一个参数传递给servlet的service方法。你也向下转换ex02.pyrmont.Response实例为javax.servlet.ServletResponse,并作为第二个参数传递给servlet的service方法这会危害安全性。知道这个servlet容器的内部运作的Servlet程序员可以分别把ServletRequest和ServletResponse实例向下转换为ex02.pyrmont.Request和ex02.pyrmont.Response,并调用他们的公共方法。拥有一个Request实例,它们就可以调用parse方法。拥有一个Response实例,就可以调用sendStaticResource方法。
添加二个类:
RequestFacade:
package com.test.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.AsyncContext;
import javax.servlet.DispatcherType;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RequestFacade implements ServletRequest{
private ServletRequest request = null;
public RequestFacade(Request request)
{
this.request = request;
}
@Override
public Object getAttribute(String name) {
return request.getAttribute(name);
}
@Override
public Enumeration<String> getAttributeNames() {
return request.getAttributeNames();
}
@Override
public String getCharacterEncoding() {
return null;
}
@Override
public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
}
@Override
public int getContentLength() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return null;
}
@Override
public ServletInputStream getInputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getParameter(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<String> getParameterNames() {
// TODO Auto-generated method stub
return null;
}
@Override
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, String[]> getParameterMap() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getProtocol() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getScheme() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServerName() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getServerPort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public BufferedReader getReader() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRemoteAddr() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRemoteHost() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setAttribute(String name, Object o) {
// TODO Auto-generated method stub
}
@Override
public void removeAttribute(String name) {
// TODO Auto-generated method stub
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<Locale> getLocales() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isSecure() {
// TODO Auto-generated method stub
return false;
}
@Override
public RequestDispatcher getRequestDispatcher(String path) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRealPath(String path) {
// TODO Auto-generated method stub
return null;
}
@Override
public int getRemotePort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getLocalName() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getLocalAddr() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getLocalPort() {
// TODO Auto-generated method stub
return 0;
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return null;
}
@Override
public AsyncContext startAsync() {
// TODO Auto-generated method stub
return null;
}
@Override
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAsyncStarted() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAsyncSupported() {
// TODO Auto-generated method stub
return false;
}
@Override
public AsyncContext getAsyncContext() {
// TODO Auto-generated method stub
return null;
}
@Override
public DispatcherType getDispatcherType() {
// TODO Auto-generated method stub
return null;
}
}
ResponseFacade:
package com.test.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
public class ResponseFacade implements ServletResponse{
private ServletResponse response;
public ResponseFacade(Response response)
{
this.response = response;
}
@Override
public String getCharacterEncoding() {
return response.getCharacterEncoding();
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return null;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public PrintWriter getWriter() throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setCharacterEncoding(String charset) {
// TODO Auto-generated method stub
}
@Override
public void setContentLength(int len) {
// TODO Auto-generated method stub
}
@Override
public void setContentType(String type) {
// TODO Auto-generated method stub
}
@Override
public void setBufferSize(int size) {
// TODO Auto-generated method stub
}
@Override
public int getBufferSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void flushBuffer() throws IOException {
// TODO Auto-generated method stub
}
@Override
public void resetBuffer() {
// TODO Auto-generated method stub
}
@Override
public boolean isCommitted() {
// TODO Auto-generated method stub
return false;
}
@Override
public void reset() {
// TODO Auto-generated method stub
}
@Override
public void setLocale(Locale loc) {
// TODO Auto-generated method stub
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
}
ServletProcessor修改一下:
Servlet servlet = null;
RequestFacade requestFacade = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);
try {
servlet = (Servlet) myClass.newInstance();
servlet.service((ServletRequest) requestFacade,(ServletResponse)responseFacade);
}
相关文章推荐
- Tomcat的安装与在myeclips中的配置
- 【转】Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
- 一台电脑同时运行多个tomcat配置方法 (转)
- [Windows Server 2012] Tomcat安装方法
- jetty、tomcat启动发生异常 java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl
- 模块化架构之tomcat的jsp加载处理
- Tomcat数据源
- Windows下Tomcat配置
- install plugins, such as spring (STS), maven, tomcat, etc.
- tomcat启动闪退的原因之一
- tomcat下CORS(跨域资源共享) 的配置
- Tomcat的跨区域访问问题
- CentOS 6.7 配置JSP运行环境之tomcat
- 《How Tomcat Works》学习笔记(一)
- 一个服务器多个Tomcat问题
- Tomcat启动内存设置
- MyEclipse的tomcat端口号的修改
- Tomcat热部署
- Tomcat下work文件夹的作用
- 配置tomcat,在访问时不需要加端口号和工程名