Annotation

  what&introduction

  1、Annotation,是Java5的新特性,JDK5引入了Metadata(元数据)很容易的就能够调用Annotations。Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误。Anannotation对代码的执行没有什么影响。Annotations使用@annotation的形式应用于代码:类(class),属性(attribute),方法(method)等等。一个Annotation出现在上面提到的开始位置,而且一般只有一行,也可以包含有任意的参数。用于简化Bean的配置,某些场合可以取代XML配置文件。

@Named注解

  要注入接口,我们使用@Inject注释。注释基本上做了它说的。它注入应用程序中可用的组件。容器有我们支付接口的两种实现,所以他不知道注入哪一种。所以我们需要CDI提供@Named注释,允许为实现指定名称。根据Spring文档,“JSR 330的@Named注释可以用来检测组件并为它们提供名称。@Named注释的主要角色是定义一个bean,用于解析应用程序中的EL语句,通常是通过JSF EL解析器。可以使用名称执行注入,但这不是CDI中的注入的工作方式,因为CDI为我们提供了更丰富的方式来表示注入点和要注入到其中的bean。

@Named("cash")
public class CashPaymentImpl implements Payment {

    private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());

    @Override
    public void pay(BigDecimal amount) {
        LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());
    }
}
@Named("visa")
public class VisaPaymentImpl implements Payment {

    private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());

    @Override
    public void pay(BigDecimal amount) {
        LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());
    }
}

@RequestScoped

public @ interface requestscope,指定bean的请求范围:

  • 在web应用程序中任何servlet的service()方法期间,在任何servlet过滤器的doFilter()方法期间,以及当容器调用任何ServletRequestListener或AsyncListener时。
  • 在任何Java EE web服务调用期间,
  • 在任何EJB的任何远程方法调用期间、在任何EJB的任何异步方法调用期间、在对EJB超时方法的任何调用期间以及在向任何EJB消息驱动bean传递消息期间
  • 在为从Java EE组件环境获得的JMS主题或队列向MessageListener传递任何消息期间。

请求上下文被销毁:

  • 在servlet请求结束时,在service()方法、所有doFilter()方法以及所有requestDestroyed()和onComplete()通知返回之后,
  • 在web服务调用完成之后,在EJB远程方法调用、异步方法调用、超时或消息传递完成之后,
  • 或者在消息传递到MessageListener之后返回。

Analysis of Web.xml in Hello1 project

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

xmlns:xmlns 属性可以在文档中定义一个或多个可供选择的命名空间。该属性可以放置在文档内任何元素的开始标签中。该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属性所在元素内的所有内容。

 xsi:schemaLocation属性其实是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性,定义了XML Namespace和对应的XSD(Xml Schema Definition)文档的位置的关系。它的值由一个或多个URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的XML Namespace的值,第二个URI给出Schema文档的位置,Schema处理器将从这个位置读取Schema文档,该文档的targetNamespace必须与第一个URI相匹配。

<context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
</context-param>

1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>

2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
<servlet>
        <servlet-name>Faces Servlet</servlet-name>#servlet名
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>#设置servlet类
     <load-on-startup>1</load-on-startup>#启动的时候实例化并调用其init()方法的优先级
</servlet>

Java servlet是扩展服务器功能的Java程序,servlet可以响应任何类型的请求,但它们通常实现驻留在Web服务器上的应用程序,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

load-on-startup标记容器是否在启动的时候实例化并调用其init()方法的优先级。它的值表示servlet应该被载入的顺序当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;如果值小于0或未指定时,则表示只有在第一次请求的容器才在该servlet调用初始化函数正值越小,servlet的优先级越高,应用启动时就越先加载。值相同时,容器就会自己选择顺序来加载。

<servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>#Servlet的名字,唯一性和一致性,与<servlet>元素中声明的名字一致。
        <url-pattern>*.xhtml</url-pattern>#指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。<servlet-mapping>将URL模式映射到某个Servlet,即该Servlet处理的URL。
 </servlet-mapping>

加载Servlet的过程

容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径(<url- pattern>)做匹配,如果匹配成功,则调用这个Servlet处理请求。

<session-config>
        <session-timeout>
            30
        </session-timeout>
</session-config>

session-timeout元素用来指定默认的会话超时时间间隔,以分钟为单位,session.timeout只能在1~1440(也就是24小时内)的整数范围内选取,其他都是超出范围报错的,上述为设置三十分钟不操作session,session既失效。

<welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

当用户在浏览器中输入的URL不包含某个servlet名或JSP页面时,welcome-file-list元素可指定显示的默认文件。

原文地址:https://www.cnblogs.com/sensenma533/p/10554759.html