复旦大学:《面向对象分析和设计》课程资料_AntiPattern_2.Servlet

[J2EE AntiPattern----Servlet]
1

Servlet J2EE Refactoring Patterns/AntiPatterns 徐迎晓 复旦大学软件学院 xuyingxiao@126.com
2

e Including Common Functionality in Every Servlet ● Introduce Filters e Using Strings for Content Generation ● Use jDom e Template Text in Servlet Use JSPs 反模式及重构方案 如果尽量 Use jsP,如果无法使用JSP,则 Use jdom重构
反模式及重构方案 如果尽量Use JSP,如果无法使用JSP,则Use Jdom重构 3

AntiPattern e Including Common Functionality in Every Servlet
5

Before Refactoring uh1ev4ddot( trier.etR的at工的et enm, ethene数 goet. finetbuL. tostrlegt)S 图中的注释: l实际项日中 中的字符串应该放在 static fina public变量中,并导入(impo含有该变量的类 ggercserweParameterLog9er中的字符串应该放在 static final publie变量中,并导入含有该变量的类 public void doGe(Hlp ServetRequest request, HttpservletreSponse response throws Serve:Exception, OExce 0: i <sues ength: i+
图中的注释: //实际项目中Logger.getLogger(“ServletParameterLogger”);中的字符串应该放在static final public 变量中,并导入(import)含有该变量的类 ----- public class BuzzyServlet extends HttpServlet { // In a real app you should keep strings like the // name of this logger in a static final public // variable and import that class. //实际项目中Logger.getLogger(“ServletParameterLogger”);中的字符串应该放在static final public 变量中,并导入含有该变量的类 private static Logger logger = Logger.getLogger(“ServletParameterLogger”); /** * Constructor for BuzzyServlet. */ public BuzzyServlet() { super(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logParameters(request); // Do the buzzy business process. } private void logParameters(HttpServletRequest request) { Enumeration enum = request.getParameterNames(); StringBuffer buf = new StringBuffer(128); while (enum.hasMoreElements()) { String name = (String) enum.nextElement(); String values[] = request.getParameterValues(name); buf.append(¡°parameter = ¡°); buf.append(name); buf.append(¡° values = {¡°); for (int i = 0; i < values.length; i++) { buf.append(values[i]); } buf.append(¡°}\n¡±); } logger.fine(buf.toString()); } } 6

. public class Buzzy Servlet extends Httpservlet ( private static Logger logger Logger. getLogger("ServletParameterLogger' public Buzzy servlet blic void doGet(.)throws ServletException, IOEXception l Do the buzzy business process privatevoidlogparamEters(httpservletrequestrequest 将与处理代码——日志记录嵌在 doGet()方法中了——日志记录是硬编码的」 没有灵活性。 要调整日志记录格式怎么办?其他地方也要进行日志怎么办?——多个地方要用 日志的话需要拷贝代码,维护困难 实际应用中,除了日志还会有很多其他公共功能→引入过滤器,见下页
将与处理代码——日志记录 嵌在doGet( )方法中了——日志记录是硬编码的, 没有灵活性。 要调整日志记录格式怎么办? 其他地方也要进行日志怎么办?——多个地方要用 日志的话需要拷贝代码,维护困难 实际应用中,除了日志,还会有很多其他公共功能引入过滤器,见下页 7

Refactoring--lntroduce Filters pubi le la a tea ap yoe how ia wetp stiring. 1x wariable and import that servlet reponse restore wh41e(和num,上ae1指ent们) Ingl enu, nexe() string valueat- request. getParanetervaluesiname) Iint .s 0t .< va luen. 1ength: 14)( but,app f. appendl)” gex, .notbut, costrng》 public vold init(1ltencontig contig) c 重构后放在过滤器中,然后构建部署描述文件 重构 1找出多个Sere中所共有的预处理和后处理代码 2.对每个分别 创建过滤器实现类 构建部署描述文件 相应 Serve中删除预处理和后处理代码 部署和测试
重构后放在过滤器中,然后构建部署描述文件 重构 1.找出多个Servlet中所共有的预处理和后处理代码 2. 对每个分别 创建过滤器实现类 构建部署描述文件 相应Servlet中删除预处理和后处理代码 部署和测试 8

public class Logging Filter implements Filter private static Logger logger= Logger getLogger("ServletParameterLogger) public void doFilter( ServletRe ServletResponse response Filter Chain chain)t public void destroyo( public void init(FilterConfig config)t public class LoggingFilter implements Filter In a real app you should keep strings like the ∥ ame of this logger in a static final public variable and import that class private static Logger logger Logger getLogger("ServletParameterLogger) ServletRequest request, ServletResponse response Filter Chain chain)( Enumeration enum request getParameterNameso: StringBuffer buf new String Buffer(128) while(enum. hasMoreElementso)( String name =(String)enum nextElement o: buf append(name): buf append( values=t) for(int i=0, i< values. length; i++) buf append(values) buf append(A\n) logger. fine(buf. to 0) public void destroyo t
9 public class LoggingFilter implements Filter { // In a real app you should keep strings like the // name of this logger in a static final public // variable and import that class. private static Logger logger = Logger.getLogger("ServletParameterLogger"); public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) { Enumeration enum = request.getParameterNames(); StringBuffer buf = new StringBuffer(128); while (enum.hasMoreElements()) { String name = (String) enum.nextElement(); String values[] = request.getParameterValues(name); buf.append("parameter = "); buf.append(name); buf.append(" values = {"); for (int i = 0; i < values.length; i++) { buf.append(values[i]); } buf.append("}\n"); } logger.fine(buf.toString()); } public void destroy() { } public void init(FilterConfig config) { } }

Intercepting Filter Pattern Core j2 EE Patterns拦截过滤器模式 10
Core J2EE Patterns 拦截过滤器模式 10

creates Clent invokes FitterManager m FiMterChain invokes Target ordered) Filter creates
11
按次数下载不扣除下载券;
注册用户24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
- 复旦大学:《面向对象分析和设计》课程资料_AntiPattern_1.JSP J2EE Refactoring Patterns/AntiPatterns.pdf
- 复旦大学:《面向对象分析和设计》课程资料_分析模式_责任模式 Accountability.pdf
- 复旦大学:《面向对象分析和设计》课程资料_分析模式_观察和测量模式.pptx
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_UMLProfile.pdf
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_5.5 Iteration 3 持久化框架 DESIGNING A PERSISTENCE FRAMEWORK WITH PATTERNS.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_5.4 Iteration 3 状态图 MODELING BEHAVIOR IN STATECHART DIAGRAMS.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_5.3 Iteration 3 SSD和合约 ADDING NEW SSDs AND CONTRACTS.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_5.2 Iteration 3 领域模型 MODELING GENERALIZATION & REFINING THE DOMAIN MODEL.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_5.1 Iteration 3 用例加关系.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_4.2 Iteration 2 用GoF设计用例实现 DESIGNING USE-CASE REALIZATIONS WITH GoF DESIGN PATTERNS.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_4.1 Iteration 2 GRASP:MORE PATTERNS.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.5 Iteration 1 实现模型.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.4 Iteration 1 设计模型 GRASP——设计带职责的对象.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.4 Head 2 On to Object Design.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.4 Head 1 Logical Architecture and UML Package Diagrams.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.3 Iteration 1 用例模型——操作合约添加细节.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.2 Iteration 1 用例模型——SSD.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_3.1 Iteration 1 领域模型——概念的可视化.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_2 Inception 用例模型和其他需求.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML&GRASP_1.4 案例分析.ppt
- 复旦大学:《面向对象分析和设计》课程资料_Error Handling.pdf
- 复旦大学:《面向对象分析和设计》课程资料_Exception handling refactorings.pdf
- 复旦大学:《面向对象分析和设计》课程资料_课程注册系统_1-5 最佳实践、需求、分析设计、架构分析、用例分析.pdf
- 复旦大学:《面向对象分析和设计》课程资料_课程注册系统_6-8 Identify Design Elements、RunTime Architecture、Describe Distribution.pdf
- 复旦大学:《面向对象分析和设计》课程资料_课程注册系统_9-11 UC Design、Subsystem Design、Class Design.pdf
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 1 - 面向对象分析和设计.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 2 - 迭代、进化和敏捷.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_OOP:Object-Oriented Programming.pptx
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 3 - 案例分析 THE NEXTGEN POS SYSTEM.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 4 Chapter 5 - 初始阶段的需求.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 6 - 用例.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 7 - 其他需求.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 8 - 细化阶段的迭代——基础.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 9 - 领域模型.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 10 - 系统顺序图.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 11 - 操作契约.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 13 - 逻辑架构和UML包图.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 14 - 迈向对象设计.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 15 - UML交互图.ppt
- 复旦大学:《面向对象分析和设计》课程资料_UML和模式_Chapter 16 - UML类图.ppt