java怎么重写拦截修改jar_如何修改第三方jar包里的类的方法,使得jar包里的方法都调用自己重写的方法...

作者使用的框架为ureport2(基于java的spring引擎的报表框架)

7236a5153603

image.png

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd

">

可以看到我想修改的类被加入到了spring中管理

我们先来看看这个类的方法:

/*******************************************************************************

* Copyright 2017 Bstek

*

* Licensed under the Apache License, Version 2.0 (the "License"); you may not

* use this file except in compliance with the License. You may obtain a copy

* of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

* License for the specific language governing permissions and limitations under

* the License.

******************************************************************************/

package com.bstek.ureport.console.designer;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.antlr.v4.runtime.ANTLRInputStream;

import org.antlr.v4.runtime.CommonTokenStream;

import org.apache.commons.io.IOUtils;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import com.bstek.ureport.cache.CacheUtils;

import com.bstek.ureport.console.RenderPageServletAction;

import com.bstek.ureport.console.cache.TempObjectCache;

import com.bstek.ureport.console.exception.ReportDesignException;

import com.bstek.ureport.definition.ReportDefinition;

import com.bstek.ureport.dsl.ReportParserLexer;

import com.bstek.ureport.dsl.ReportParserParser;

import com.bstek.ureport.dsl.ReportParserParser.DatasetContext;

import com.bstek.ureport.export.ReportRender;

import com.bstek.ureport.expression.ErrorInfo;

import com.bstek.ureport.expression.ScriptErrorListener;

import com.bstek.ureport.parser.ReportParser;

import com.bstek.ureport.provider.report.ReportProvider;

/**

* @author Jacky.gao

* @since 2017年1月25日

*/

public class DesignerServletAction extends RenderPageServletAction {

private ReportRender reportRender;

private ReportParser reportParser;

private List reportProviders=new ArrayList();

@Override

public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String method=retriveMethod(req);

if(method!=null){

invokeMethod(method, req, resp);

}else{

VelocityContext context = new VelocityContext();

context.put("contextPath", req.getContextPath());

resp.setContentType("text/html");

resp.setCharacterEncoding("utf-8");

Template template=ve.getTemplate("ureport-html/designer.html","utf-8");

PrintWriter writer=resp.getWriter();

template.merge(context, writer);

writer.close();

}

}

public void scriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expression();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void conditionScriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expr();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void parseDatasetName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String expr=req.getParameter("expr");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(expr);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

parser.removeErrorListeners();

DatasetContext ctx=parser.dataset();

String datasetName=ctx.Identifier().getText();

Map result=new HashMap();

result.put("datasetName", datasetName);

writeObjectToJson(resp, result);

}

public void savePreviewData(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

content=decodeContent(content);

InputStream inputStream=IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream,"p");

reportRender.rebuildReportDefinition(reportDef);

IOUtils.closeQuietly(inputStream);

TempObjectCache.putObject(PREVIEW_KEY, reportDef);

}

public void loadReport(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

file=ReportUtils.decodeFileName(file);

Object obj=TempObjectCache.getObject(file);

if(obj!=null && obj instanceof ReportDefinition){

ReportDefinition reportDef=(ReportDefinition)obj;

TempObjectCache.removeObject(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}else{

ReportDefinition reportDef=reportRender.parseReport(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}

}

public void deleteReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.deleteReport(file);

}

public void saveReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

file=ReportUtils.decodeFileName(file);

String content=req.getParameter("content");

content=decodeContent(content);

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.saveReport(file, content);

InputStream inputStream=IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream, file);

reportRender.rebuildReportDefinition(reportDef);

CacheUtils.cacheReportDefinition(file, reportDef);

IOUtils.closeQuietly(inputStream);

}

public void loadReportProviders(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

writeObjectToJson(resp, reportProviders);

}

public void setReportRender(ReportRender reportRender) {

this.reportRender = reportRender;

}

public void setReportParser(ReportParser reportParser) {

this.reportParser = reportParser;

}

@Override

public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {

super.setApplicationContext(applicationContext);

Collection providers=applicationContext.getBeansOfType(ReportProvider.class).values();

for(ReportProvider provider:providers){

if(provider.disabled() || provider.getName()==null){

continue;

}

reportProviders.add(provider);

}

}

@Override

public String url() {

return "/designer";

}

}

没错,作者我本人想修改ureport2的loadReport方法,因为框架中的下载文件名一直是ureport-p.xlsx,所以我想修改。

作者在这里提供2种方法,有一种方法是我工作的老大给的建议

1:我的思路

7236a5153603

image.png

新建一个类和jar包类的方法一模一样,因为自己的代码的优先级高于maven依赖的版本

参考网址:https://blog.csdn.net/yw_1207/article/details/80828236

代码如下:

package com.sf.energy.nplatform.report.adapter;

import com.bstek.ureport.cache.CacheUtils;

import com.bstek.ureport.console.RenderPageServletAction;

import com.bstek.ureport.console.cache.TempObjectCache;

import com.bstek.ureport.console.designer.ReportDefinitionWrapper;

import com.bstek.ureport.console.designer.ReportUtils;

import com.bstek.ureport.console.exception.ReportDesignException;

import com.bstek.ureport.definition.ReportDefinition;

import com.bstek.ureport.dsl.ReportParserLexer;

import com.bstek.ureport.dsl.ReportParserParser;

import com.bstek.ureport.export.ReportRender;

import com.bstek.ureport.expression.ErrorInfo;

import com.bstek.ureport.expression.ScriptErrorListener;

import com.bstek.ureport.parser.ReportParser;

import com.bstek.ureport.provider.report.ReportProvider;

import org.antlr.v4.runtime.ANTLRInputStream;

import org.antlr.v4.runtime.CommonTokenStream;

import org.apache.commons.io.IOUtils;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import java.util.*;

/**

* @Author bi xuan

* @Date 1/27/2021 2:52 PM

* @Version 1.0

*/

public class DesignerServletAction extends RenderPageServletAction {

private ReportRender reportRender;

private ReportParser reportParser;

private List reportProviders=new ArrayList();

private String fileName;

public String getFileName() {

return fileName;

}

@Override

public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String method=retriveMethod(req);

if(method!=null){

invokeMethod(method, req, resp);

}else{

VelocityContext context = new VelocityContext();

context.put("contextPath", req.getContextPath());

resp.setContentType("text/html");

resp.setCharacterEncoding("utf-8");

Template template=ve.getTemplate("ureport-html/designer.html","utf-8");

PrintWriter writer=resp.getWriter();

template.merge(context, writer);

writer.close();

}

}

public void scriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expression();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void conditionScriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expr();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void parseDatasetName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String expr=req.getParameter("expr");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(expr);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

parser.removeErrorListeners();

ReportParserParser.DatasetContext ctx=parser.dataset();

String datasetName=ctx.Identifier().getText();

Map result=new HashMap();

result.put("datasetName", datasetName);

writeObjectToJson(resp, result);

}

public void savePreviewData(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

content=decodeContent(content);

InputStream inputStream= IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream,"p");

reportRender.rebuildReportDefinition(reportDef);

IOUtils.closeQuietly(inputStream);

TempObjectCache.putObject(PREVIEW_KEY, reportDef);

}

public void loadReport(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

//备注file不能修改,调试源码时发现这个loadReport被调用了两次,第一次是加载整个报表界面使用,第二次是加载报表列表使用,改了就会报错

file= ReportUtils.decodeFileName(file);

this.fileName = file;

// this.fileName = this.fileName.replace("file:","").split(".")[0];

this.fileName = this.fileName.replace("file:","").split("\\.")[0];

Object obj=TempObjectCache.getObject(file);

if(obj!=null && obj instanceof ReportDefinition){

ReportDefinition reportDef=(ReportDefinition)obj;

TempObjectCache.removeObject(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}else{

ReportDefinition reportDef=reportRender.parseReport(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}

}

public void deleteReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.deleteReport(file);

}

public void saveReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

file=ReportUtils.decodeFileName(file);

String content=req.getParameter("content");

content=decodeContent(content);

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.saveReport(file, content);

InputStream inputStream=IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream, file);

reportRender.rebuildReportDefinition(reportDef);

CacheUtils.cacheReportDefinition(file, reportDef);

IOUtils.closeQuietly(inputStream);

}

public void loadReportProviders(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

writeObjectToJson(resp, reportProviders);

}

public void setReportRender(ReportRender reportRender) {

this.reportRender = reportRender;

}

public void setReportParser(ReportParser reportParser) {

this.reportParser = reportParser;

}

@Override

public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {

super.setApplicationContext(applicationContext);

Collection providers=applicationContext.getBeansOfType(ReportProvider.class).values();

for(ReportProvider provider:providers){

if(provider.disabled() || provider.getName()==null){

continue;

}

reportProviders.add(provider);

}

}

@Override

public String url() {

return "/designer";

}

}

然后将其加入到spring管理中,我这里使用的和框架一样的方式,使用xml的bean标签加入到xml中

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd

">

修改的代码:

之前的calss为jar包里类的reference。

由于jvm的加载优先级问题,就会找bean的id找到我们的类进行实例化加到bean,替代了框架里的类。

到此我们思路结束了。

2:我工作老大的思路

7236a5153603

image.png

新建一个adapter类

代码如下:

package com.sf.energy.nplatform.report.adapter;

import com.bstek.ureport.cache.CacheUtils;

import com.bstek.ureport.console.RenderPageServletAction;

import com.bstek.ureport.console.cache.TempObjectCache;

import com.bstek.ureport.console.designer.DesignerServletAction;

import com.bstek.ureport.console.designer.ReportDefinitionWrapper;

import com.bstek.ureport.console.designer.ReportUtils;

import com.bstek.ureport.console.exception.ReportDesignException;

import com.bstek.ureport.definition.ReportDefinition;

import com.bstek.ureport.dsl.ReportParserLexer;

import com.bstek.ureport.dsl.ReportParserParser;

import com.bstek.ureport.export.ReportRender;

import com.bstek.ureport.expression.ErrorInfo;

import com.bstek.ureport.expression.ScriptErrorListener;

import com.bstek.ureport.parser.ReportParser;

import com.bstek.ureport.provider.report.ReportProvider;

import org.antlr.v4.runtime.ANTLRInputStream;

import org.antlr.v4.runtime.CommonTokenStream;

import org.apache.commons.io.IOUtils;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import java.util.*;

/**

* @Author bi xuan

* @Date 2021/1/13 18:19

* @Version 1.0

*/

//@Component

public class DesignerServletActionAdapter extends RenderPageServletAction {

// @Autowired

private ReportRender reportRender;

// @Autowired

private ReportParser reportParser;

private List reportProviders=new ArrayList();

private String fileName;

public String getFileName() {

return fileName;

}

@Override

public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String method=retriveMethod(req);

if(method!=null){

invokeMethod(method, req, resp);

}else{

VelocityContext context = new VelocityContext();

context.put("contextPath", req.getContextPath());

resp.setContentType("text/html");

resp.setCharacterEncoding("utf-8");

Template template=ve.getTemplate("ureport-html/designer.html","utf-8");

PrintWriter writer=resp.getWriter();

template.merge(context, writer);

writer.close();

}

}

public void scriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expression();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void conditionScriptValidation(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(content);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

ScriptErrorListener errorListener=new ScriptErrorListener();

parser.removeErrorListeners();

parser.addErrorListener(errorListener);

parser.expr();

List infos=errorListener.getInfos();

writeObjectToJson(resp, infos);

}

public void parseDatasetName(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String expr=req.getParameter("expr");

ANTLRInputStream antlrInputStream=new ANTLRInputStream(expr);

ReportParserLexer lexer=new ReportParserLexer(antlrInputStream);

CommonTokenStream tokenStream=new CommonTokenStream(lexer);

ReportParserParser parser=new ReportParserParser(tokenStream);

parser.removeErrorListeners();

ReportParserParser.DatasetContext ctx=parser.dataset();

String datasetName=ctx.Identifier().getText();

Map result=new HashMap();

result.put("datasetName", datasetName);

writeObjectToJson(resp, result);

}

public void savePreviewData(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String content=req.getParameter("content");

content=decodeContent(content);

InputStream inputStream= IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream,"p");

reportRender.rebuildReportDefinition(reportDef);

IOUtils.closeQuietly(inputStream);

TempObjectCache.putObject(PREVIEW_KEY, reportDef);

}

public void loadReport(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

//备注file不能修改,调试源码时发现这个loadReport被调用了两次,第一次是加载整个报表界面使用,第二次是加载报表列表使用,改了就会报错

file= ReportUtils.decodeFileName(file);

this.fileName = file;

// this.fileName = this.fileName.replace("file:","").split(".")[0];

this.fileName = this.fileName.replace("file:","").split("\\.")[0];

Object obj=TempObjectCache.getObject(file);

if(obj!=null && obj instanceof ReportDefinition){

ReportDefinition reportDef=(ReportDefinition)obj;

TempObjectCache.removeObject(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}else{

ReportDefinition reportDef=reportRender.parseReport(file);

writeObjectToJson(resp, new ReportDefinitionWrapper(reportDef));

}

}

public void deleteReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

if(file==null){

throw new ReportDesignException("Report file can not be null.");

}

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.deleteReport(file);

}

public void saveReportFile(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String file=req.getParameter("file");

file=ReportUtils.decodeFileName(file);

String content=req.getParameter("content");

content=decodeContent(content);

ReportProvider targetReportProvider=null;

for(ReportProvider provider:reportProviders){

if(file.startsWith(provider.getPrefix())){

targetReportProvider=provider;

break;

}

}

if(targetReportProvider==null){

throw new ReportDesignException("File ["+file+"] not found available report provider.");

}

targetReportProvider.saveReport(file, content);

InputStream inputStream=IOUtils.toInputStream(content,"utf-8");

ReportDefinition reportDef=reportParser.parse(inputStream, file);

reportRender.rebuildReportDefinition(reportDef);

CacheUtils.cacheReportDefinition(file, reportDef);

IOUtils.closeQuietly(inputStream);

}

public void loadReportProviders(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

writeObjectToJson(resp, reportProviders);

}

public void setReportRender(ReportRender reportRender) {

this.reportRender = reportRender;

}

public void setReportParser(ReportParser reportParser) {

this.reportParser = reportParser;

}

@Override

public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {

super.setApplicationContext(applicationContext);

Collection providers=applicationContext.getBeansOfType(ReportProvider.class).values();

for(ReportProvider provider:providers){

if(provider.disabled() || provider.getName()==null){

continue;

}

reportProviders.add(provider);

}

}

@Override

public String url() {

return "/designer";

}

}

然后修改自己的xml

哈哈,你可能发现这不是一模一样吗?

其实我厚着脸皮承认其实都是我工作老大给的思路,

接下来是前方高能:作者自己的思路

因为我才毕业半年,在我接触到Java时就是springboot了,我不喜欢xml文件,所以我要用注解

7236a5153603

image.png

xml注释掉

7236a5153603

image.png

抱着好奇的心态run了一下,可以,这时开始头脑一片问号

@Autowired注解是根据byType进行加载的

这明显我的type是DesignerServletActionAdapter,jar包的是DesignServletAction,这类型都不同,是怎么替换的啊!

我决定查看调用栈一探究竟

7236a5153603

image.png

7236a5153603

image.png

7236a5153603

image.png

7236a5153603

image.png

7236a5153603

image.png

没错。他是根据url这个方法来获取类的!(其实这里还是有一个疑惑,因为我重写的类的方法返回的还是/desinger,难到是因为我写的优先级方法高吗?)

7236a5153603

image.png

判断url的源码为:

/*******************************************************************************

* Copyright 2017 Bstek

*

* Licensed under the Apache License, Version 2.0 (the "License"); you may not

* use this file except in compliance with the License. You may obtain a copy

* of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

* License for the specific language governing permissions and limitations under

* the License.

******************************************************************************/

package com.bstek.ureport.console;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Collection;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;

/**

* @author Jacky.gao

* @since 2017年1月25日

*/

public class UReportServlet extends HttpServlet {

private static final long serialVersionUID = 533049461276487971L;

public static final String URL = "/ureport";

private Map actionMap = new HashMap();

@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

WebApplicationContext applicationContext = getWebApplicationContext(config);

Collection handlers = applicationContext.getBeansOfType(ServletAction.class).values();

for (ServletAction handler : handlers) {

String url = handler.url();

if (actionMap.containsKey(url)) {

throw new RuntimeException("Handler [" + url + "] already exist.");

}

actionMap.put(url, handler);

}

}

protected WebApplicationContext getWebApplicationContext(ServletConfig config){

return WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());

}

@Override

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String path = req.getContextPath() + URL;

String uri = req.getRequestURI();

String targetUrl = uri.substring(path.length());

if (targetUrl.length() < 1) {

outContent(resp, "Welcome to use ureport,please specify target url.");

return;

}

int slashPos = targetUrl.indexOf("/", 1);

if (slashPos > -1) {

targetUrl = targetUrl.substring(0, slashPos);

}

ServletAction targetHandler = actionMap.get(targetUrl);

if (targetHandler == null) {

outContent(resp, "Handler [" + targetUrl + "] not exist.");

return;

}

RequestHolder.setRequest(req);

try{

targetHandler.execute(req, resp);

}catch(Exception ex){

resp.setCharacterEncoding("UTF-8");

PrintWriter pw=resp.getWriter();

Throwable e=buildRootException(ex);

resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

String errorMsg = e.getMessage();

if(StringUtils.isBlank(errorMsg)){

errorMsg=e.getClass().getName();

}

pw.write(errorMsg);

pw.close();

throw new ServletException(ex);

}finally{

RequestHolder.clean();

}

}

private Throwable buildRootException(Throwable throwable){

if(throwable.getCause()==null){

return throwable;

}

return buildRootException(throwable.getCause());

}

private void outContent(HttpServletResponse resp, String msg) throws IOException {

resp.setContentType("text/html");

PrintWriter pw = resp.getWriter();

pw.write("");

pw.write("UReport Console");

pw.write("

");

pw.write(msg);

pw.write("");

pw.write("");

pw.flush();

pw.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值