??xml version="1.0" encoding="utf-8" standalone="yes"?> JDBC 是java~程中一pd允许单连接到很多数据库(特别是关pd数据库)~程APIs . In Java 2 Platform, Standard Edition (J2SE) 5.0, java.sql Q提供java讉K处理贮存在数据源Q特别是关系型数据库Q中的数据,有最基础常用的对象如Connection, ResultSet, Statement, and PreparedStatement。这个包j2se 和j2eeq_都可使用? javax.sqlQ提供java讉K处理服务器端数据源。这个包lj2ee提供服务Q如DataSource 和RowSet? ODBC bridge是以ODBC标准 C API 方式实现JDBC 的库? 而言之,JDBC是一个和database-independent 的访问数据库的API? DriverManager是唯一可以创徏数据库连接的cRDriverManagerҎ各个厂商Q如Oracle, MySQL, and SybaseQ提供的驱动创徏数据库? What Is ODBC Q? Open Database Connectivity (ODBC) 是一U来自微软的~程接口Q他为Windows应用E序讉K|络上数据库提供了通用语言?ODBC is a C-based interface 问题Q如果用c++写数据库客户端,你不得不在另一q_重新写客LQPC版的不能在Macintosh上运行。两个原因:1.c++不是跨^台的Q很多东西没有特别指定(如int型用多少位表C)2 更重要的是,想网l访问,GUI框架库等在各个^C同。ODBC的另一个问题是Q接口复杂学习时间长。JDBC去除了这些问题,问关pL据库引入q_无关的解x案。因为性能问题和缺事务支? JDBC-ODBC bridge 驱动只适合实验用或没有其他可选方法? What Is a JDBC-ODBC Bridge? 而言之,JDBC-ODBC bridge通过大多数ODBC驱动来提供JDBC讉K。它是一个把JDBC操作转换为ODBC操作的JDBC驱动。(ODBC操作是由 C-based libraries实现的——ODBC功能仍然在二q制代码库中Q如果数据库或硬件^台更换,需要替换ODBC库)。brige作ؓsun.jdbc.odbc包实玎ͼ包含一个native library用来讉KODBC。sun.jdbc.odbc包在/jre/lib/rt.jar中,包含一个sun.jdbc.odbc.JdbcOdbcDriverc,用来JDBC驱动。注意,JDBC-ODBC bridge是一U“万能”的方式Q因此可能比一些特别设计的JDBC驱动慢? SQL is a Data Manipulation Language (DML—媄响数据库对象内容的命令集) and a Data Definition Language (DDL—媄响数据库对象l构的命令集).SQL also 提供控制事务命o (such as commit and rollback) q接jdbc的过E参?a href="http://www.aygfsteel.com/yuxh/archive/2009/04/24/267280.html" target="_blank">JDBC加蝲分析 。MJDBC驱动的作用是提供各种数据库的具体实现(实现了java.sql.Driver接口)Q隐藏具体数据库的细节(每个数据库厂商可能会为同一个数据库提供不止一个驱动,q些效率Qh?性能会有不同Q? 在fianlly中立d?释放 JDBC资源(such as the ResultSet, Statement, PreparedStatement, and Connection objects)Q而不是等他们自己关闭Q会改进应用E序的性能。写一个工L释放q些资源是一个好办法? JDBC API主要用来传SQL statementl数据库Q但也能d表格式数据源的数据,q种来自javax.sql.RowSetl接口的d能力可以被定制去使用更新spreadsheet,flat file cM表格式数据源的数据? JDBC有四U类型的驱动q接数据库?/p> 异常QSQLException:有getNextException()可以链接一pd异常Q还有很多方法可以展C额外的错误/异常信息。SQLWarning:SQLException的子c,表示非致命可忽略BatchUpdateException:扚w更新时出现的错误Q除了SQLException提供的信息,q有错误发生前已成功执行多少条数据DataTruncation:意外truancate 数据抛出?/p>
]]>
JDBC API ׃个包定义:
to SQL-based database systems. It provides a consistent interface for communicating with a database and for accessing database metadata (information about the database system vendor and how the tables, views, and data are stored).ODBC作ؓ标准出现。厂商ؓ各自的DBMS提供了各U的驱动或bridges。从java客户端访问ODBC-based数据库,可以使用JDBC-ODBC bridgeQ因此可以用JDBC-ODBC bridge讉K支持ODBC的数据库Q比如Microsoft Access。微软ؓ他的操作pȝ提供ODBC driver manager。ODBC driver manager协调讉KODBC驱动和对应的数据源?
命名服务目的Q把命名和对象联pv来,提供用命名访问对象的Ҏ?/p>
目录服务Q允许属性和对象联系Q比如用户对象的email地址属性,Q命名服务不提供Q,因此能利用目录服务访问对象属性或以属性ؓ基础查找对象?/p>
?span style="font-family: Times New Roman">tomcat下,我们通常q样来解决中文ؕ码问题:
qo器代码:
web.xml中过滤器配置
<!--采用的字符~码配置成应用初始化参数而不是过滤器U有的初始化参数是因为在JSP和其他地方也可能需要?->
<context-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</context-param>
<filter>
<filter-name>ContentTypeFilter</filter-name>
<filter-class>filter.ContentTypeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ContentTypeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
equest.setCharacterEncoding(charset); 必须写在W一ơ用request.getParameter()之前Q这h能保证参数是按照已经讄的字W编码来获取?br /> response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前Q这h能保证out按照已经讄的字W编码来q行字符输出?/p>
通过qo器,我们可以保证在Servlet或JSP执行之前p|好了请求和响应的字W编码?/p>
但是q样q不能完全解决中文ؕ码问题:
对于posthQ无论是“获取参数环节”q是“输出环节"都是没问题的Q?/p>
对于gethQ?输出环节"没有问题Q但?获取参数环节"依然出现中文qQ所以在输出时直接将q输出了?/p>
原因是posth和geth存放参数位置是不同的Q?/p>
post方式参数存放在请求数据包的消息体中?get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value¶me2=value2的Ş式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据v作用Q对于URI字段中的参数不v作用Q我们通常通过下面的代码来完成~码转换Q?/p>
String paramValue = request.getParameter("paramName");
paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);
但是每次q行q样的{换实在是很麻烦,有没有统一的解x案呢Q?/p>
解决Ҏ1: 在tomcat_home"conf"server.xml 中的Connector元素中设|URIEncoding属性ؓ合适的字符~码
<Connector port="8080" protocol="HTTP/1.1"q样做的~点是,同一个tomcat下的其他应用也将受到影响。而其每次部v旉需要类修改配置也很ȝ?/p>
解决Ҏ2:自定义请求包装器包装hQ将字符~码转换的工作添加到getParameter()Ҏ?br />
修改qo器的doFilterҎ 代码如下Q?br />
q样一来,在servlet中调用包装器的getParametersҎ来获取参敎ͼ已l完成了字符~码的{换过E,我们׃需要在每次获取参数时来q行字符~码转换了?br /> ȝQ自己写cȝ承HttpServletRequestWrapperQHttpServletRequestWrapper实现了HttpServletRequest接口。看tomcat的源代码可以发现QServletRequest作ؓ一个Component QServletRequestWrapper作ؓ一个比较标准的Decorator Q实现ServletRequest接口q把ServletRequest当作成员变量Q其他承Decorator 的类Q比如本例中的GetHttpServletRequestWrapper Q就可以很好的操控ServletRequest及其子类Q比如本例中的HttpServletRequestQ,HttpServletRequest的很多方法就可以Ҏ我们的需求做改变Q比如设|字W,LI格?/span>
Web 上最常用的两U?Http h是 Get h?Post h了。我们在?java web 开发时Q也M?servlet 中通过 doGet ?doPost Ҏ来处理请求;更经常地Q我们会?doGet Ҏ的实C调用 doPost Ҏ。尽做了近两年?web 开发,我对诸如 Get h?Post h的基本概念仍不是十分了解。近日阅诅R?javascript 高E序设计》重新整理了一?Get h?Post h的概念,是MW记吧?
Get 是从服务器上获取数据Q这是最常见的请求类型。每ơ在览器中输入 URL 打开面Ӟ是向服务器发送一?Get h?Get h的参数是用问可加到 URL l尾Q后面跟着用&q接h的名Uͼ值对。比如网址 http://bt.neupioneer.com/viewthread.php?tid=87813 Q其?tid 为参数名Q?87813 为参数的倹{在~程中,使用 Get 最多的地方是链接列表,其中的参数多是从数据库读出的字段拼接而成。在 Ajax 中,我们也经怋?Get Q通过提取出页面的标签|拼成串后构造一?URL ?Get 在用上是有限制的, URL 的最大长度ؓ 2KB Q因此,如果表单中包含textareaq样的大文本D,׃要用Get了。对于表单来_ Get 是把参数数据队列加到提交表单?ACTION 属性所指的 URL 中,值和表单内各个字D一一对应Q通过 URL 可以看到中传递的参数。因此,相比?Post Q它是不安全的?
Post 的用场合多是在表单提交的地方,因ؓ?Get 相比Q?Post 可以发送更多的数据Q?javascript 高E序设计》中说最多可以发?2GB Q这多少让我不太怿Q网上一些文章说 IIS4 中最大量?80KB Q?IIS5 中ؓ 100KB Q不知道 Tomcat 中的情况如何?Post 是通过 HTTP Post 机制Q将表单内各个字D与其内Ҏ|在 HTML Header 内一起传送到 ACTION 属性所指的 URL 地址??Get 相比Q?Post 的内Ҏ不会?URL 中显现出来的Q这多少是安全一些的?我在做登录这L表单Ӟ只是请求方式设?Post Q得用户名和密码信息不在浏览器中显玎ͼ但不清楚的是Q是否有更好的方法加密密码等信息Q实在不知道如果h不传到服务器的话Q怎么Ҏ知的h加密Q清楚的朋友不妨l个解决ҎQ。在 Ajax 中,如果要和服务器交互,记得加上 request.setRequestHeader(“Content-Type”,”application/x-www-urlencoded”); q一脚本Q尽很?Ajax 教材中都提到了这一炏V另外要说的是,被传递的参数是要l过~码的。在 javascript 中,~码函数?encodeURIComponent(xx) ?nbsp;
以上转自 http://blog.csdn.net/yoland/archive/2009/03/19/4005740.aspx
一个get的发送请求例子:
GET /select/selectBeerTaste.jsp?color=dark&taste=malty HTTP/1.1
Host: www.wickedlysmart.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/
20030624 Netscape/7.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/
plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
CAS h以下特点Q?/p>
CAS Client 与受保护的客L应用部v在一P?Filter 方式保护受保护的资源。对于访问受保护资源的每?Web hQCAS Client 会分析该h?Http h中是否包?Service TicketQ如果没有,则说明当前用户尚未登录,于是请求重定向到指定好?CAS Server d地址Qƈ传?Service Q也是要访问的目的资源地址Q,以便d成功q后转回该地址。用户在W?3 步中输入认证信息Q如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service TicketQƈ~存以待来验证Q之后系l自动重定向?Service 所在地址Qƈ为客L览器设|一?Ticket Granted CookieQTGCQ,CAS Client 在拿?Service 和新产生?Ticket q后Q在W?5Q? 步中?CAS Server q行w䆾合适,以确?Service Ticket 的合法性?/p>
在该协议中,所有与 CAS 的交互均采用 SSL 协议Q确保,ST ?TGC 的安全性。协议工作过E中会有 2 ơ重定向的过E,但是 CAS Client ?CAS Server 之间q行 Ticket 验证的过E对于用h透明的?/p>
另外QCAS 协议中还提供?Proxy Q代理)模式Q以适应更加高、复杂的应用场景Q具体介l可以参?CAS 官方|站上的相关文档?/p>
?Tomcat 上部|一个完整的 CAS Server 主要按照以下几个步骤Q?/p>
如果希望 Tomcat 支持 HttpsQ主要的工作是配|?SSL 协议Q其配置q程和配|方法可以参?Tomcat 的相x档。不q在生成证书的过E中Q会有需要用C机名的地方,CAS 不要使用 IP 地址Q而要使用机器名或域名。(目q程中没使用Q?/p>
CAS
Server 是一?Web 应用包,前面下载的 cas-server-3.1.1-release.zip 解开Q把其中?
cas-server-webapp-3.1.1.war 拯?tomcat?webapps 目录Qƈ更名?
cas.war。由于前面已配置?tomcat ?https 协议Q可以重新启?
tomcatQ然后访问:https://localhost:8443/casQ没配置ssh应该是http://localhost:8080/casQ?Q如果能出现正常?CAS d面Q则说明 CAS
Server 已经部v成功?/p>
虽然 CAS Server 已经部v成功Q但q只是一个缺省的实现Q在实际使用的时候,q需要根据实际概况做扩展和定Ӟ最主要的是扩展认证 (Authentication) 接口?CAS Server 的界面?/p>
参?/strong>http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html
目也采用jdbc验证,文章介绍了三个基?JDBC ?AuthenticationHandlerQ我使用的cas-server 3.3 多了一个AbstractJdbcUsernamePasswordAuthenticationHandler 直接使用?br />
The rules a forwarding servlet must follow are relatively strict:
It may set headers and the status code but may not send any response body to the client (that's the job for an include). Consequently, the forward( ) must be called before the response has been committed.
If the response already has been committed, the forward( ) call throws an IllegalStateException.
If the response has not been committed but there's content within the response buffer, the buffer is automatically cleared as part of the forward.
In addition, you can't get creative by substituting new request and response objects. The forward( ) method must be called with the same request and response objects as were passed to the calling servlet's service method, and the forward( ) must be called from within the same handler thread.
如果servlet A转发到servlet BQB得到的\径信息应该是和直接调用B一LQ从q方面来说B完全控制h。这也是Z么确保response的缓存会在调用之前冲掉,response没有被提交是很重要的事情?br> 用\径{发的问题是:目标lg不但Ҏ务器lg可见Q也必须对客L可见。出于安全考虑Q可能会让一些组件不是公共可见的Q所以用名字代替路径做{发:getNamedDispatcher 不过没有URI路径也就不能加上查询字符Ԍ路径也不能做调整?br> forward ?tt style="color: rgb(0,0,0)" class="monofont">sendRedirect谁更?/tt>Qrequest dispatch 在服务器端发生,redirect在客L发生?tt class="monofont">forward最好用在一个组件必d理业务逻辑而且和另一个组件分享结果的情况。sendRedirict最好用于客户需要从一重定向于另一c看h用forward比较有诱惑,因ؓforward在服务器内部完成QsendRedirectq需要从客户端倒一遍,所以forward更快。不q的是处理相对URL的时候会引v问题。例Q?br>public class HomePageForward extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
RequestDispatcher dispatcher = req.getRequestDispatcher("/index.html");
dispatcher.forward(req, res);
}
}
如果index.html中有<img src="../../../images/trans.gif"/>则图片不能读取?tt class="monofont">sendRedirect会告诉客L文g来源于文件根目录Qforward不会。因Z需要调?tt class="monofont">getContext查询Q?tt class="monofont">sendRedirect更容易{发到其他context的资源中?span style="background-color: rgb(255,0,0)">所以徏议是量?tt class="monofont">sendRedirectQ必ȝ情况下才用forward?/tt>
RequestDispatcher的includeҎ把资源的内容攑օ当前的respongse中。它实现了一U我们可以称为编E式服务器端 include。不同于forwardQ在调用include后的servlet A仍然控制response而且可能包含 被包含进来内容的前后内容?br> ?Q?br> doGet(..){
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<HTML><HEAD><TITLE>Welcome to Nile</TITLE></HEAD>");
out.println("<BODY>");
// Show an item in an online catalog
out.println("Feast your eyes on this beauty:");
RequestDispatcher dispatcher =
req.getRequestDispatcher("/servlet/NileItem?item=0596000405");
dispatcher.include(req, res);
out.println("And, since I like you, it's 20% off!");
out.println("</BODY></HTML>");
}
The request and response parameters must be the same objects as were passed to the calling servlet's service method, and the include( ) must be called from within the same handler thread.
The included resource must use an output mechanism that matches the caller's. If the caller uses a PrintWriter, then the included resource must use a PrintWriter. If the caller uses an OutputStream, then the included resource must use an OutputStream. If the mechanisms don't match, the included servlet throws an IllegalStateException. If you can, make sure to use the PrintWriter for all text output, and this won't be a problem.
synchronized(getServletContext()) { getServletContext().setAttribute(“foo? ?/span>22?; getServletContext().setAttribute(“bar? ?/span>42?; out.println(getServletContext().getAttribute(“foo?); out.println(getServletContext().getAttribute(“bar?); }