Java 不是抽象的,并且不重写抽象方法错误
我完全陷入了一个显示错误的课堂:Java 不是抽象的,并且不重写抽象方法错误,java,servlets,http-headers,Java,Servlets,Http Headers,我完全陷入了一个显示错误的课堂: ResettableHttpServletResponse is not abstract and does not override abstract method getHeaderNames() in HttpServletResponse 这是我的全班同学: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.
ResettableHttpServletResponse is not abstract and does not override abstract method getHeaderNames() in HttpServletResponse
这是我的全班同学:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.exception.NestableRuntimeException;
@SuppressWarnings("deprecation")
public class ResettableHttpServletResponse implements HttpServletResponse, Resettable {
private interface ResponseOperation {
void apply();
}
private HttpServletResponse wrapped;
private List<ResponseOperation> operations;
private Locale locale;
private int bufferSize;
private String contentType;
private String charset;
private PrintWriter writer;
private OutputStream outputStream;
private ServletOutputStream servletOutputStream;
private File contents;
private Set<String> headerNames;
private int status;
private boolean stateApplied;
public ResettableHttpServletResponse(final HttpServletResponse response) {
wrapped = response;
operations = new ArrayList<ResponseOperation>();
headerNames = new HashSet<String>();
resetState();
}
@Override
public void addCookie(final Cookie cookie) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.addCookie(cookie);
}
});
}
@Override
public void addDateHeader(final String name, final long date) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.addDateHeader(name, date);
}
});
}
@Override
public void addHeader(final String name, final String value) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.addHeader(name, value);
}
});
}
@Override
public void addIntHeader(final String name, final int value) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.addIntHeader(name, value);
}
});
}
@Override
public void applyState() {
try {
// Apply all operations
for (final ResponseOperation operation : operations) {
operation.apply();
}
// Copy the response contents, if any
if (outputStream != null) {
try {
outputStream.flush();
IOUtils.copy(new FileInputStream(contents), wrapped.getOutputStream());
} catch (final Exception e) {
throw new NestableRuntimeException(e);
}
} else if (writer != null) {
try {
writer.flush();
IOUtils.copy(new FileReader(contents), wrapped.getWriter());
} catch (final Exception e) {
throw new NestableRuntimeException(e);
}
}
stateApplied = true;
} finally {
reset();
}
}
@Override
public boolean containsHeader(final String name) {
return headerNames.contains(name);
}
@Override
public String encodeRedirectUrl(final String url) {
return wrapped.encodeRedirectUrl(url);
}
@Override
public String encodeRedirectURL(final String url) {
return wrapped.encodeRedirectURL(url);
}
@Override
public String encodeUrl(final String url) {
return wrapped.encodeUrl(url);
}
@Override
public String encodeURL(final String url) {
return wrapped.encodeURL(url);
}
@Override
public void flushBuffer() throws IOException {
// No-op, as nothing has been done in the real response
}
@Override
public int getBufferSize() {
return bufferSize;
}
@Override
public String getCharacterEncoding() {
return charset;
}
@Override
public String getContentType() {
return contentType;
}
@Override
public Locale getLocale() {
return locale;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
if (writer != null) {
throw new IllegalStateException("getWriter() was already invoked in this response");
}
if (servletOutputStream == null) {
contents = File.createTempFile("cyclos_", "_response");
outputStream = new FileOutputStream(contents);
servletOutputStream = new ServletOutputStream() {
@Override
public void close() throws IOException {
outputStream.close();
}
@Override
public void flush() throws IOException {
outputStream.flush();
}
@Override
public void write(final byte[] b) throws IOException {
outputStream.write(b);
}
@Override
public void write(final byte[] b, final int off, final int len) throws IOException {
outputStream.write(b, off, len);
}
@Override
public void write(final int b) throws IOException {
outputStream.write(b);
}
};
}
return servletOutputStream;
}
public int getStatus() {
return status;
}
@Override
public PrintWriter getWriter() throws IOException {
if (outputStream != null) {
throw new IllegalStateException("getOutputStream() was already invoked");
}
if (writer == null) {
contents = File.createTempFile("cyclos_", "_response");
writer = new PrintWriter(contents);
}
return writer;
}
@Override
public boolean isCommitted() {
if (!stateApplied) {
return false;
}
return wrapped.isCommitted();
}
@Override
public void reset() {
resetState();
}
@Override
public void resetBuffer() {
IOUtils.closeQuietly(outputStream);
IOUtils.closeQuietly(writer);
outputStream = null;
servletOutputStream = null;
writer = null;
if (contents != null) {
contents.delete();
contents = null;
}
}
@Override
public void resetState() {
status = 0;
operations.clear();
headerNames.clear();
charset = wrapped.getCharacterEncoding();
bufferSize = wrapped.getBufferSize();
contentType = wrapped.getContentType();
locale = wrapped.getLocale();
resetBuffer();
}
@Override
public void sendError(final int sc) {
status = sc;
operations.add(new ResponseOperation() {
@Override
public void apply() {
try {
wrapped.sendError(sc);
} catch (final IOException e) {
throw new NestableRuntimeException(e);
}
}
});
}
@Override
public void sendError(final int sc, final String msg) throws IOException {
status = sc;
operations.add(new ResponseOperation() {
@Override
public void apply() {
try {
wrapped.sendError(sc, msg);
} catch (final IOException e) {
throw new NestableRuntimeException(e);
}
}
});
}
@Override
public void sendRedirect(final String location) throws IOException {
operations.add(new ResponseOperation() {
@Override
public void apply() {
try {
wrapped.sendRedirect(location);
} catch (final IOException e) {
throw new NestableRuntimeException(e);
}
}
});
}
@Override
public void setBufferSize(final int bufferSize) {
this.bufferSize = bufferSize;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setBufferSize(bufferSize);
}
});
}
@Override
public void setCharacterEncoding(final String charset) {
this.charset = charset;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setCharacterEncoding(charset);
}
});
}
@Override
public void setContentLength(final int len) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setContentLength(len);
}
});
}
@Override
public void setContentType(final String contentType) {
this.contentType = contentType;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setContentType(contentType);
}
});
}
@Override
public void setDateHeader(final String name, final long date) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setDateHeader(name, date);
}
});
}
@Override
public void setHeader(final String name, final String value) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setHeader(name, value);
}
});
}
@Override
public void setIntHeader(final String name, final int value) {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setIntHeader(name, value);
}
});
}
@Override
public void setLocale(final Locale locale) {
this.locale = locale;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setLocale(locale);
}
});
}
@Override
public void setStatus(final int sc) {
status = sc;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setStatus(sc);
}
});
}
@Override
public void setStatus(final int sc, final String sm) {
status = sc;
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.setStatus(sc, sm);
}
});
}
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入java.util.HashSet;
导入java.util.List;
导入java.util.Locale;
导入java.util.Set;
导入javax.servlet.ServletOutputStream;
导入javax.servlet.http.Cookie;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.io.IOUtils;
导入org.apache.commons.lang.exception.NestableRuntimeException;
@抑制警告(“弃用”)
公共类ResettableHttpServletResponse实现HttpServletResponse,resetable{
专用接口响应操作{
无效应用();
}
私有HttpServletResponse;
私人名单业务;
私人场所;
私有int缓冲区大小;
私有字符串contentType;
私有字符串字符集;
私人版画作家;
私有输出流输出流;
私有ServletOutputStream ServletOutputStream;
私有文件内容;
私人设置的总部;
私人身份;
应用私有布尔状态;
公共重置表HttpServletResponse(最终HttpServletResponse){
包装=响应;
操作=新建ArrayList();
headerNames=newhashset();
重置状态();
}
@凌驾
公共void addCookie(最终Cookie){
添加(新的响应操作(){
@凌驾
公开无效申请(){
包装好的饼干;
}
});
}
@凌驾
public void addDateHeader(最终字符串名、最终长日期){
添加(新的响应操作(){
@凌驾
公开无效申请(){
wrapped.addDateHeader(名称、日期);
}
});
}
@凌驾
public void addHeader(最终字符串名称、最终字符串值){
添加(新的响应操作(){
@凌驾
公开无效申请(){
wrapped.addHeader(名称、值);
}
});
}
@凌驾
public void addIntHeader(最终字符串名、最终整数值){
添加(新的响应操作(){
@凌驾
公开无效申请(){
已包装。AddInHeader(名称、值);
}
});
}
@凌驾
公共无效applyState(){
试一试{
//应用所有操作
用于(最终响应操作:操作){
操作。应用();
}
//复制响应内容(如果有)
if(outputStream!=null){
试一试{
outputStream.flush();
copy(新文件输入流(内容),wrapped.getOutputStream());
}捕获(最终异常e){
抛出新的NestableRuntimeException(e);
}
}else if(writer!=null){
试一试{
writer.flush();
copy(新文件读取器(目录),wrapped.getWriter();
}捕获(最终异常e){
抛出新的NestableRuntimeException(e);
}
}
stateApplied=true;
}最后{
重置();
}
}
@凌驾
公共布尔containsHeader(最终字符串名){
返回headerNames.contains(名称);
}
@凌驾
公共字符串url(最终字符串url){
返回wrapped.encodeRedirectUrl(url);
}
@凌驾
公共字符串url(最终字符串url){
返回wrapped.encodeRedirectURL(url);
}
@凌驾
公共字符串编码url(最终字符串url){
返回wrapped.encodeUrl(url);
}
@凌驾
公共字符串编码url(最终字符串url){
返回wrapped.encodeURL(url);
}
@凌驾
public void flushBuffer()引发IOException{
//没有操作,因为在实际响应中没有执行任何操作
}
@凌驾
public int getBufferSize(){
返回缓冲区大小;
}
@凌驾
公共字符串getCharacterEncoding(){
返回字符集;
}
@凌驾
公共字符串getContentType(){
返回contentType;
}
@凌驾
公共语言环境getLocale(){
返回区域设置;
}
@凌驾
公共ServletOutputStream getOutputStream()引发IOException{
if(writer!=null){
抛出新的IllegalStateException(“此响应中已调用getWriter());
}
if(servletOutputStream==null){
contents=File.createTempFile(“cyclos_u”,“_响应”);
outputStream=新文件outputStream(内容);
servletOutputStream=新的servletOutputStream(){
@凌驾
public void close()引发IOException{
outputStream.close();
}
@凌驾
public void flush()引发IOException{
outputStream.flush();
}
@凌驾
公共无效写入(最终字节[]b)引发IOException{
outputStream.write(b);
}
@凌驾
公共无效写入(最终字节[]b,最终整数关闭,最终整数len)引发IOException{
outputStream.write(b,off,len);
}
@凌驾
public void write(final int b)引发IOException{
outputStream.write(b);
}
};
}
返回servletOutputStream;
}
public int getStatus(){
返回状态;
}
@凌驾
@Override
public Collection<String> getHeaderNames() {
operations.add(new ResponseOperation() {
@Override
public void apply() {
wrapped.getHeaderNames();
}
});
return headerNames;
}