?? day03.txt
字號:
Servlet_day03 langna 2007-9-25 星期二
回顧:
1, 如何編寫線程安全的servlet? 唯一的,成員變量,靜態變量, 寫的時候加鎖,讀的時候不需要;
2, 如何讀取請求中的參數?
作業:
1, 計數器: 訪問此servlet的次數:
int current=0;
synchronized(this)
{
count++;
current=count;
}
out.println(current);
指定字符集:告訴瀏覽器我這里有特殊字符;
response.setContentType("text/html;charset=gbk");
2, getParameterMap: key -- String
value-- String[]
一, ServletInputStream / ServletOutputStream
getReader:調了這個系統就不會再給你封裝了,getParameter就得不到了;
getParameter:調了這個系統把參數給你封裝好了, 就不能調getReader了;
xml文件: version="2.4" ; 2.4 之前用的是dtd約束的; 2.4之后用的是Schema;
虛擬路徑也叫servlet路徑;
getContextPath: 應用路徑
將serv-app 改為 servlet-app ;
1)一個 servlet 可以部署在任何應用中; 因為虛擬路徑是從應用之后開始寫的;
2)對于form表單中的action的路徑有影響;因為這里的路徑是從應用路徑開始寫的;
解決的方法是在:action中改成動態的路徑;將靜態頁面變成servlet;
將整個頁面寫到doGet()請求中;將路徑寫成動態的;
3)將action中的應用路徑去掉;改成相對路徑;
相對路徑:相對的是當前請求; serv-app/request/form.html; 虛擬路徑是: /request/parameter
action="parameter" ;
ServletPath: 虛擬路徑
*.do 通配模式;一個servlet服務多個請求
MVC模式: 多個servlet之間通信;
二, 分布式:
數據庫服務器; C/S;
B/S: web browser -- web server -- DB
java中支持分布式的技術;
數據庫;jdbc;
RMI; 遠程方法調用;
兼容c++ ; corba語言;
IDL; 接口訪問語言;
JDBC的編程步驟: (安裝驅動)
1, 加載驅動;
2, 建立連接;
3,創建statement;
4,執行sql語句;
5,處理結果集;
6,釋放資源;
將數據庫的去定ojdbc14.jar 放到 common/lib 包下; 這樣會在tomcat啟動的時候會找到
這個驅動啊!
init(); 配置init 參數; 不需要同步;單線程的;
service()中只讀也不需要同步;
servlet 從數據庫中讀數據封裝成html發送到客戶端;
create: 創建記錄,增加
read: 讀記錄,
update:更新記錄
delete:刪除記錄
例子:
1,建表: (依賴于數據庫的)
create table ln_user(
id number(4) primary key,
name varchar2(20) not null,
birthday date,
gender varchar2(6),
phone number(20)
);
保存為credbs.sql ; 一般都用sqlplus建表,除非用臨時表才在程序中建;
2,建一個序列:
create sequence ln_seq;
insert into ln_user values(ln_seq.nextval,'langna',sysdate-24,'femail',1376);
to_date('2007-9-3','yyyy-mm-dd')
3, 數據庫的異常在servlet方法中捕獲并向客戶端拋出servlet異常;
在servlet中寫jdbc代碼,訪問數據庫;
做靜態原型頁面;再變成動態的;
IO異常也應該往外拋, 不是面向最終用戶的;是被調的;
4, 配初始化參數:
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.tarena.UserServlet</servlet-class>
<init-param>
<param-name>jdbcurl</param-name>
<param-value>jdbc:oracle:thin:@192.168.0.201:1521:tarena</param-value>
</init-param>
<init-param>
<param-name>driver</param-name>
<param-value>oracle.jdbc.driver.OracleDriver</param-value>
</init-param>
<init-param>
<param-name>username</param-name>
<param-value>xjh0704</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>xjh0704</param-value>
</init-param>
</servlet>
5, 將不同的技術分層: jdbc和servlet分層 ; UserService
6, jdbc 連接數據庫, 讀配置文件dbconfig.properties; 放到classes文件夾中;(相對于類路徑)
driverClassName=oracle.jdbc.driver.OracleDriver
dburl=jdbc:oracle:thin:@192.168.0.201:1521:tarena
username=openlab
password=open123
用類裝載器來定位資源:
InputStream in = UserService.class.getClassLoader()
.getResourceAsStream("config/dbconfig.properties"); //classpath--classes下
Properties prop=new Properties();
prop.load(in);
in.close();
prop.getProperties("dburl");
對eclipse而言,項目的根是類路徑; 而不是當前路徑;
在命令行下,將文件的路徑追加到類路徑下; 也可以找到相關的資源;
將jdbc相同的代碼抽取出來,做一個工具包; JdbcUtil { }
將讀配置文件放到靜態代碼塊中;只讀一次就行;在靜態代碼塊中拋ExceptionInInitializerError異常;
private static Properties config = new Properties();
static{
try{
InputStream in = ConnectionFactory.class.getClassLoader()
.getResourceAsStream("config/dbconfig.properties");
config.load(in);
in.close();
}catch(IOException e){
e.printStackTrace();
throw new ExceptionInInitializerError();
}
}
三, MVC
1,解析請求:控制作用 C UserActionServlet : 將showUser()去掉
2,處理請求:業務 M UserService / User / JDBCUtil
3,返回客戶端結果:視圖 V UserListViewServlet : 將showUser的代碼放到這里的doGet方法里;
(JSP)
一個servlet怎么調另外的servlet; 上下文=應用;
ServletContext: 全局對象,在同一個應用中只有一個,任何一個servlet都可以訪問它;
在UserActionServlet轉向UserListViewServlet:
{
Collection users = userServices.findUsers();
request.setAttribute("users", users);//將要傳的數據放到請求中;
ServletContext application = getServletContext();
RequestDispatcher dispatcher = application
.getRequestDispatcher("/user/list/view");
//傳的是目標servlet的虛擬路徑(與web.xml中的一致);
dispatcher.forward(request, response);
}
UserListViewServlet
{
Collection students = (Collection)request.getAttribute("users");
}
M: jdbc , javabeans , EJB
V: servlet/jsp
C: servlet
起到了一個松耦合的作用;
關于配置:
1, oracle用的是8080,把端口占用了;
改tomcat的端口號:
apache-tomcat-5.5.20\conf\server.xml\Connector 8080-->8088/80(不需要加端口)
2, web.xml 加一個空格; 修改后
context.xml <Context reloadable="true"> //會自動監視classes下的文件;
3, 寫一個腳本:
主目錄下,建一個bin 自動加到path下 ; echo $path
vi .bash_prifile path=$HOME/bin: 默認有這個路徑;即這個目錄下的可執行命令可以在任何目錄下執行;
工程 -- abc , src-- 源文件: HelloworldServlet.java, classes -- 類路徑
在bin/servletc.sh寫上: -cp=-classpath
javac -d $HOME/abc/classes -cp $CATALINA_HOME/common/lib/servlet-api.jar $1(腳本運行時的第一個參數)
在src目錄下直接編譯就行:
servletc.sh HelloworldServlet.java
將tomcat 應用的類編譯時的所有內容寫到sh文件中,生成的字節碼文件放到想放的地方 :
javac -d $CATALINA_HOME/webapps/abc/WEB-INF/classes
-cp $CATALINA_HOME/common/lib/*.jar $1
或者:
javac -d $1 -cp $CATALINA_HOME/common/lib/*.jar $2
$1 : 目標路徑
$2 : 源文件
4, 在eclipse中配置數據庫和服務器:
1) eclipse-jee-europa-win32;
databases--> SQL-JDBCConnection--> name: oracle20@oracle --->
選擇一個驅動---> oracle9(oracle-thin)---> driver-name: oracle14-->
jar包-- add jar-- ojdbc14.jar ---> 將屬性寫上
2)
建一個 web 工程, 建的時候有一個runtime 配置,將tomcat安裝目錄導入即可;
部署描述符:
dynamic web moudle -- 2.4
java-- 5.0
content-root : 應用名
src: 直接寫類或建一個servlet; 可以直接配置servlet的初始化參數和url
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -