当前位置: 首页 > news >正文

收废铁的做网站有优点吗vps建wordpress

收废铁的做网站有优点吗,vps建wordpress,河北建筑工程信息网站,网站制作蒙特我们编写满足特定业务逻辑的服务API。 涵盖所有服务API#xff08;如安全性#xff0c;日志记录#xff0c;审核#xff0c;度量延迟等#xff09;的跨领域问题很少。 这是一个重复的非业务代码#xff0c;可以在其他方法之间重用。 重用的一种方法是将这些重复的代码移入… 我们编写满足特定业务逻辑的服务API。 涵盖所有服务API如安全性日志记录审核度量延迟等的跨领域问题很少。 这是一个重复的非业务代码可以在其他方法之间重用。 重用的一种方法是将这些重复的代码移入其自己的方法并在服务API中调用它们例如 public class MyService{public ServiceModel service1(){isAuthorized();//execute business logic.} }public class MyAnotherService{public ServiceModel service1(){isAuthorized()://execute business logic. } } 上面的方法会起作用但不会在不产生代码噪声的情况下将交叉关注点与业务逻辑混合在一起。 有另一种方法可以通过使用Aspect来解决上述要求这种方法称为面向方面的编程AOP。 您可以使用AOP的不同方式-通过使用Spring AOPJavaEE AOP。 在此示例中我将尝试在Java EE应用程序中使用使用CDI的AOP。 为了解释这一点我选择了一个非常简单的示例该示例构建一个Web应用程序以从Database中获取少量记录并显示在浏览器中。 创建数据访问层 表结构为 create table people(id INT NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL,place varchar(100),primary key(id)); 让我们创建一个Model类来保存个人信息 package demo.model; public class Person{private String id;private String name;private String place;public String getId(){ return id; } public String setId(String id) { this.id id;}public String getName(){ return name; } public String setName(String name) { this.name name;}public String getPlace(){ return place; } public String setPlace(String place) { this.place place;} } 让我们创建一个公开两种方法的数据访问对象– 获取所有人的细节 获取给定ID的一个人的详细信息 package demo.dao;import demo.common.DatabaseConnectionManager; import demo.model.Person; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List;public class PeopleDAO {public ListPerson getAllPeople() throws SQLException {String SQL SELECT * FROM people;Connection conn DatabaseConnectionManager.getConnection();ListPerson people new ArrayList();try (Statement statement conn.createStatement();ResultSet rs statement.executeQuery(SQL)) {while (rs.next()) {Person person new Person();person.setId(rs.getString(id));person.setName(rs.getString(name));person.setPlace(rs.getString(place));people.add(person);}}return people;}public Person getPerson(String id) throws SQLException {String SQL SELECT * FROM people WHERE id ?;Connection conn DatabaseConnectionManager.getConnection();try (PreparedStatement ps conn.prepareStatement(SQL)) {ps.setString(1, id);try (ResultSet rs ps.executeQuery()) {if (rs.next()) {Person person new Person();person.setId(rs.getString(id));person.setName(rs.getString(name));person.setPlace(rs.getString(place));return person;}}}return null;} } 您可以使用自己的方法来获取新的连接。 在上面的代码中我创建了一个静态实用程序该实用程序返回了相同的连接。 创建拦截器 创建拦截器涉及2个步骤 创建Interceptor绑定该绑定创建带InterceptorBinding注释的注释该注释用于绑定拦截器代码和需要拦截的目标代码。 创建一个用Interceptor注释的类其中包含拦截器代码。 它包含用AroundInvoke注释的方法不同的生命周期注释 AroundTimeout等。 让我们通过名称LatencyLogger创建一个拦截器绑定 package demo;import java.lang.annotation.Target; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.*; import static java.lang.annotation.ElementType.*; import javax.interceptor.InterceptorBinding;InterceptorBinding Retention(RUNTIME) Target({METHOD, TYPE}) public interface LatencyLogger {} 现在我们需要创建Interceptor代码该代码以Interceptor注释并以上面创建的Interceptor绑定进行注释即LatencyLogger package demo; import java.io.Serializable; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext;Interceptor LatencyLogger public class LatencyLoggerInterceptor implements Serializable{AroundInvokepublic Object computeLatency(InvocationContext invocationCtx) throws Exception{long startTime System.currentTimeMillis();//execute the intercepted method and store the return valueObject returnValue invocationCtx.proceed();long endTime System.currentTimeMillis();System.out.println(Latency of invocationCtx.getMethod().getName() : (endTime-startTime)ms);return returnValue;} } 上面的代码中有两个有趣的事情 使用AroundInvoke 传递给方法的InvocationContext类型的参数 AroundInvoke将方法指定为拦截器方法。 一个Interceptor类只能有一个带有此注释的方法。 每当目标方法被拦截时其上下文都会传递给拦截器。 使用InvocationContext可以获取方法的详细信息并将参数传递给该方法。 我们需要在WEB-INF / beans.xml文件中声明上述拦截器 ?xml version1.0 encodingUTF-8? beans xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsdbean-discovery-modeallinterceptorsclassdemo.LatencyLoggerInterceptor/class/interceptors /beans创建带有拦截器注释的服务API 我们已经创建了Interceptor绑定和被执行的拦截器。 现在让我们创建服务API然后使用Interceptor绑定对其进行注释 /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/ package demo.service;import demo.LatencyLogger; import demo.dao.PeopleDAO; import demo.model.Person; import java.sql.SQLException; import java.util.List; import javax.inject.Inject;public class PeopleService {InjectPeopleDAO peopleDAO;LatencyLoggerpublic ListPerson getAllPeople() throws SQLException {return peopleDAO.getAllPeople();}LatencyLoggerpublic Person getPerson(String id) throws SQLException {return peopleDAO.getPerson(id);}} 我们已经用Interceptor绑定LatencyLogger注释了服务方法。 另一种方法是在类级别进行注释然后将注释应用于类的所有方法。 还要注意的另一件事是Inject批注该批注注入实例即将依赖项注入到类中。 接下来是连接Controller和View以显示数据。 控制器是servlet视图是使用JSTL标记的纯JSP。 /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/ package demo;import demo.model.Person; import demo.service.PeopleService; import java.io.IOException; import java.sql.SQLException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;WebServlet(name AOPDemo, urlPatterns {/AOPDemo}) public class AOPDemoServlet extends HttpServlet {InjectPeopleService peopleService;Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {ListPerson people peopleService.getAllPeople();Person person peopleService.getPerson(2);request.setAttribute(people, people);request.setAttribute(person, person);getServletContext().getRequestDispatcher(/index.jsp).forward(request, response);} catch (SQLException ex) {Logger.getLogger(AOPDemoServlet.class.getName()).log(Level.SEVERE, null, ex);}} } 上面的servlet可在http// localhost8080 /获得。 / AOPDemo。 它获取数据并重定向到视图以显示该数据。 请注意该服务也已使用Inject注释注入。 如果没有注入依赖项而是使用new创建依赖项则拦截器将无法工作。 这是我在构建此样本时意识到的重要一点。 呈现数据的JSP将是 %page contentTypetext/html pageEncodingUTF-8% % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % !DOCTYPE html htmlheadmeta http-equivContent-Type contenttext/html; charsetUTF-8titleAOP Demo/title/headbodyh1Hello World!/h1tabletrthId/ththName/ththPlace/th/trc:forEach items${requestScope.people} varpersontrtdc:out value${person.id}//tdtdc:out value${person.name}//tdtdc:out value${person.place}//td/tr/c:forEach/tablebr/Details for person with id2c:out valueName ${person.name} from ${person.place} //body /html 这样您将可以使用Interceptor构建一个非常简单的应用程序。 感谢您的阅读并一直与我在一起。 请分享您的查询/反馈作为评论。 并在您的朋友之间分享这篇文章 翻译自: https://www.javacodegeeks.com/2014/09/simple-aspect-oriented-programming-aop-using-cdi-in-javaee.html
http://www.lebaoying.cn/news/467.html

相关文章: