ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,书上都没怎么详细说明。现在的方法就是查看它的API文档。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。看看它的API说明
第一段说明ContextLoader可以由 ContextLoaderListener和ContextLoaderServlet生成。如果查看ContextLoaderServlet的API,可以看到它也关联了ContextLoader这个类而且它实现了HttpServlet。这个接口
第二段,ContextLoader创建的是 XmlWebApplicationContext这样一个类,它实现的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext->
BeanFactory这样一来spring中的所有bean都由这个类来创建
第三段,讲如何部署applicationContext的xml文件,如果在web.xml中不写任何参数配置信息,默认的路径是"/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:
view plaincopy to clipboardprint?
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-*.xml
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-*.xml
</param-value>
</context-param>
在<param-value> </param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并一“,”号分隔。上面的applicationContext-*.xml采用通配符,比如这那个目录下有applicationContext-ibatis-base.xml,applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都会一同被载入。
由此可见applicationContext.xml的文件位置就可以有两种默认实现:
第一种:直接将之放到/WEB-INF下,之在web.xml中声明一个listener、
第二种:将之放到classpath下,但是此时要在web.xml中加入<context-param>,用它来指明你的applicationContext.xml的位置以供web容器来加载。按照Struts2 整合spring的官方给出的档案,写成:
view plaincopy to clipboardprint?
<!-- Context Configuration locations for Spring XML files -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
</context-param>
本文转自:在Nginx下对网站进行密码保护
http://www.iii-soft.com/forum.php?mod=viewthread&tid=1680&fromuid=380
很多时候我们需要对一些网站进行密码保护,比如团队内部的站点、demo站点等等。这里所说的密码保护是服务器级的,并非网站应用层的注册登录那一套,而是利用服务器配置和htpasswd文件来实现访问的密码验证。
最后的效果就类似(不同浏览器的界面有所不同):
如果认证失败,就会报HTTP错误:401 Authorization Required。
要实现这样的功能,就需要更改服务器的配置,并设定好用于登录的用户名和密码。
首先我们需要更改网站的Nginx的server配置,Ubuntu服务器的话这个配置文件通常位于/etc/nginx/sites-enabled/,比如我这里就使用默认的配置文件/etc/nginx/sites-enabled/default来做一个例子:
- server {
- server_name www.fancycedar.info
- root /www/fancycedar
- # ...
- location / {
- # 添加下面两行
- auth_basic "Restricted";
- auth_basic_user_file htpasswd;
- # ...
- }
- # ...
- }
接下来需要创建htpasswd文件,这里有一些细节需要注意:
htpasswd的路径
和nginx.conf在同一级目录即可。Ubuntu服务器的话一般就在/etc/nginx/下面。
htpasswd的内容
每一行为一个用户,格式为username:password。但是要注意,这里的password不是明文,而是将password进行crypt(3)加密后的字符串。
你可以使用一段PHP代码来生成htpasswd中的password:
- // 密码明文
- $password = 'some password';
- // 对密码进行加密
- $password = crypt($password, base64_encode($password));
- // 获得加密后的密码
- echo $password;
然后将字符串写入htpasswd文件中:
- username1:xucqMk13TfooE
- username2:YXTfb3xWKOMBM
- ...
htpasswd的权限
需要更改htpasswd文件的权限,执行如下命令:
- sudo chown root:www-data htpasswd
- sudo chmod 640 htpasswd
Are You Ready?
当上面的准备工作都做好之后,我们就可以重新载入或者重启Nginx服务器了:
- sudo /etc/init.d/nginx reload
- # or
- sudo /etc/init.d/nginx restart
完工。
P.S. 不要忘记你设定的密码是啥了……
上次的博文中 Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射。
一对一单向关联 一对一双向关联 一对多单向关联 多对一单向关联 一对多双向关联 多对多单向关联
多对多双向关联
接下来博客,我们会分别讲解一下这七种关系映射。今天我们只讲其中的一对一单向关联。
类结构图如下所示:
具体代码如下所示:
public class Person { private int id; private String name; private IdCard idCard; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } } public class IdCard { private int id; private String cardNo; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCardNo() { return cardNo; } public void setCardNo(String cardNo) { this.cardNo = cardNo; } }
上述类结构的相应根据关联的策略不同会生成不同的表结构,可以分为主键关联和唯一外键关联。
主键关联 主键关联表结构如下:
可以看出,主键关联即利用主键进行关联,关联主键的值相同。其相应的*.hbm.xml配置文件代码如下:
<class name="com.zs.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> <class name="com.zs.hibernate.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/> </class>唯一外键关联 唯一外键关联表结构如下:
与主键关联所不同,唯一外键关联除主键外,在其一对一的指向端(Person)存在一个唯一外键,该唯一外键与被指向端(IdCard)相关联,关联主键的值相同。其相应的*.hbm.xml配置文件代码如下:
<class name="com.zs.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> <class name="com.zs.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class>
同之前的基本映射一样,我们同样可以利用注解对类带进行相关配置,这里我们就不做过多的介绍了。还是之前说过的,要想了解注解和XML相关配置的具体内容,建议大家找一本相关书籍进行详细阅读。
到此为止关于一对一单向关联我们就已经讲完了,下次我们继续讲解关系映射中的一对一双向关联。