??xml version="1.0" encoding="utf-8" standalone="yes"?>
JNDI是用于访问不同命名和目录服务的统一API接口Q?/span>
2. JNDI的架构和原理
1. 架构Q?/span>
W一层:java代码Q是讉KJNDI的代码;
W二层:JNDI APIQ统一的命名和目录服务接口
W三层:JNDI Naming ManagerQ?/span>JNDI理?/span>
W四层:JNDI SPIQ用于构?/span>JNDI实现的框Ӟ能够动态的插入命名和目录服务提供商的品;
W五层:命名和目录服务提供商的品;
命名和目录服务提供商的?/span>,例如Q?/span>DNS,LDAP,NIS,NDS……..;因ؓq些产品都是不同的提供商提供的品,所以他们的命名和目录服务的标准不一_各个目录服务采用的访问协议也是不一LQ所以,要是直接讉K他们的话Q就要编写不同的java代码来访问他们;因此Q?/span>JNDI SPIp决了q个问题Q它能动态的插入q些命名和目录服务,能够其协议专属的目录品集成到pȝ中,使得我们能只需要调用一个统一?/span>javaAPIp够访问插入的产品了;
2Q原理:
JNDI其实很好理解Q他是一个树状的l构Q它的最是一?/span>initialContext节点Q然后它的下面就是绑定的一些对象或是一?/span>subContextQ用JNDI树就能够查找到树中每一个绑定上的节点上的对象的引用Q?/span>
3.怎样q接?/span>JNDI上?
Environment environment = new Environment() ;//创徏一个环境对?/span>
environment.setProviderurl(“t3://www.aygfsteel.com”) ;
environment.setSecurityPrincipal(“todd”) ;//认证的用户名
environment.setSecurityCredentials(“841026”) ;//密码
Context context = environment.getInitialContext() ;
//创徏一?/span>subContextq绑定一个对象:
Context subContext = context.createSubcontext(“subContext”) ;
subContext.rebind(“newObject”,object) ;//l定的对象必L可序列化?/span>
subContext.close() ;
context.close() ;
4.如何通过JNDI查找bind的对象?
Object object = context.lookup(“User”) ;
//?/span>userH化到原?/span>
User user = (User)javax.rmi.PortableRemoteObject.narrow(object, User.class) ;
context.close() ;
1. 什么是servletQ?/span>
Servlet是一?/span>javac,是一个提供基于协议请求和响应?/span>javac;
2. 它的生命周期
1. 启动服务器时׃实例化ƈ加蝲servlet实例Q?/span>
2. q行初始化:自动调用initQ?/span>ServletConfig servletConfigQ方法;
3. ServletqAQ调?/span>serviceQ?/span>HttpServletRequest requestQ?/span>HttpServletResponse responseQ方法(?nbsp; ?/span> service 是dopostQ)?/span>dogetQ)ҎQ,q是客户提交Ӟ自动调用的;
4. Servlet销毁:自动调用调用distoryQ) Q?/span>
注意Q在实例化ƈ加蝲servlet后,步骤二和四只调用一ơ,而步骤三Q是在每ơ客L发出h旉调用Q?/span>
3. 怎样部v一?/span>servletQ?/span>
ServletcL必须?/span>web.xml中注册才能用的Q例如,我有一?/span>MyServletc:
必须?/span>web.xml中注册:
<web-app>
//-----------------------Servlet声明----------------------
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servletPakage.MyServlet</servlet-class>
</servlet>
//------------------------Servlet注册(镜像)---------------
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>myServletURL</ url-pattern >
</servlet-mapping>
</web-app>
q样你在提交时的Url地址是/myServletURL了;
4. 什么是serviceQ?/span>HttpServletRequest requestQ?/span>HttpServletResponse responseQ方法?
其中serviceQ?/span>HttpServletRequest requestQ?/span>HttpServletResponse responseQ方法包括两U:
1. dogetQ?/span>HttpServletRequest requestQ?/span>HttpServletResponse responseQ方法:
q种Ҏ被称为显式提交方法,主要原因是它的得到的参数攑֜url中,可以被看刎ͼ所以称为显C提 交;
例如Q有个表单:
<form action=”/myServletURL?name=todd” method=”get”>
</form>
q种Ҏ?/span>request获得的参数就是你看到?/span>name=toddQ?/span>
例如Q?/span>String s=request.getParameter(“name”);
其结?/span>s=”todd”;
2. dopostQ?/span>HttpServletRequest requestQ?/span>HttpServletResponse responseQ方法:
q种Ҏ被称为隐式提交方法,它的参数不会?/span>url里得刎ͼ而是在请求数据体得到参数Q?/span>
例如Q有个表单:
<form action=”/myServletURL” method=”post”>
<input type=”text” name=”name” value=”todd”>
</form>
q种Ҏ?/span>request获得的参数就是表单体?/span>name=toddQ?/span>
例如Q?/span>String s=request.getParameter(“name”);
其结?/span>s=”todd”;
5. 什么是ServletContext?
ServletContext是一个接口,?/span>WebApplication的视图,它的作用域时ApplicationQ它能访?/span>Application中的初始化参数和属性,它不局限域一?/span>ServletQ它属于整个ApplicationQ?/span>
ServletContext的初始化参数Q?/span>
?/span>web.xml中:
<web-app>
<context-param>
<param-name>myBlog</param-name>
<param-value>www.aygfsteel.com/todd841026</param-value>
</context-param>
</web-app>
q样?/span>application中Q意一?/span>Servlet中可以得到这个参敎ͼ
例如Q?/span>ServletContext sc = getServletContext ();
String s = sc.getInitParameter(“myBlog”);
那么l果s是”www.aygfsteel.com/todd841026”
6. 什么是ServletConfigQ?/span>
是单独的Servlet初始化配|;
例如Q在web.xml?/span>
<web-app>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servletPakage.MyServlet</servlet-class>
</servlet>
<init-param>
<param-name>cache</param-name>
<param-value>off</param-value>
</init-param>
</web-app>
在这?/span>Servlet中:ServletConfig sc = getServletConfig();
String s = sc.getInitParameter(“cache”);
那么l果s是”off”;
7. Servlet怎样处理多线E?/span>
在默认的情况下,单个Servlet实例是可以处理多个ƈ发请求的Q所以要考虑到多U程的共享同一对象的问题,例如Q?/span>
//做个Servlet中生了多少?/span>object对象一个变量的例子
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response){
Object object = new Object() ;
count++ ;
System.out.println(“count = ” + count) ;
}
当有5个用h交数据时Q因?/span>Servlet是处理多U程的,所以可能出玎ͼW四个用LE序已经执行?/span>count++Q而第五个用户刚执行完Object object = new Object() Q就会出现数据不一致性,因ؓ当前?/span>5?/span>object对象Q但?/span>count却是4Q?/span>
解决Ҏ一Q?/span>
Private boolean flag = false Q?/span>
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response){
synchronized(flag){
Object object = new Object() ;
count++ ;
}
System.out.println(“count = ” + count) ;
}
用同步程序块解决多线E的问题Q这样在同一时刻只能有一个访问该E序块了Q?/span>
解决Ҏ二:
Private int count = 0 ;
Public void dopost(HttpServletRequest request,HttpServletResponse response)
Implements SingleThreadModel{
Object object = new Object() ;
count++ ;
System.out.println(“count = ” + count) ;
}
实现SingleThreadModel接口Q可以解军_U程问题Q?/span>
8. 什么是servletqo器?
也是一?/span>javac,只是它实CFilterq个接口Q?/span>
9. servletqo器的生命周期Q?/span>
初始化:自动调用init(FilterConfig config)Ҏ
执行Q自动调?/span>doFilter()ҎQ?/span>
销毁:自动调用destory()ҎQ?/span>
10. servletqo器有什么用途?
个h认ؓ目前自己用到的Servletqo器的主要用途:是安全性检?/span>
当然qo器在Servlet之前也可以修改请求,要是?/span>Servlet之后Q也可以修改响应Q?/span>
11. servletqo器怎样部vQ?/span>
?/span>web.xml中:
<web-app>
<filter>
<filter-name>myFilter</filter-name>
<filter-class>filterPage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/Todd/*</url-pattern>
</filter-mapping>
</web-app>
q样是说要讉KWEB-INF下的Todd包下?/span>jsp?/span>Servlet的话Q就必须要先通过myFilterq个c;