1. form 表單的屬性 action 表示表單數據要提交的位置
2. 關於xml:
1)<web-app> 是XML文件的根節點,根節點中包含一個沒有前綴的命名空間。web-app標記包含兩個子標記
(1) <servlet> 標記表示要加載的servlet類所在的位置,及Servlet的名稱。
其子句包含兩個子標記,<servlet-name> 標記表示Servlet類的名稱,該名稱可以自由命名,
實際上該名稱是類的實例化對象在這裏類的名稱和類最好保持一致。
<servlet-class> 表示Servlet類的存在位置,要把全名寫出啦,即包名.類名。
(2) <servlet-mapping> 標記表示訪問Servlet類的時候,採用的URL路徑。
<servlet-name> 是Servlet類實例化名稱,要和<servlet> 標記中的名稱保持一致。
<url-pattern> 是在訪問這個Servlet時,在IE地址欄中輸入的名稱,名稱可以改變,當要注意格式,要以”/“
開始。
2)注意: 在實際操作過程中發現:
<servlet-mapping>中子標記<url-pattern>值要與JSP文件中action屬性的值一致(如果有jsp,在IE地址欄中輸入的是xxx.jsp)
3. 下面的代碼:
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
{
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out=resp.getWriter();
out.println("<html><head><title>處理Servlet請求</title></head>");
out.println("<img src=\"imgs/2.jpg\" height=400 width=260><br>");
String protocol=req.getProtocol();
out.println("使用的協議時"+protocol+"<br>");
String path=req.getServletPath();
out.println("Servlet的訪問路徑是"+path+"<br>");
int length=req.getContentLength();
out.println("請求的內容的長度"+length+"<br>");
String header1=req.getHeader("User-Agent");
out.println("獲取HTTP頭文件中User-Agent的值"+header1+"<br>");
String header2=req.getHeader("accept");
out.println("獲取HTTP頭文件中accept的值"+header2+"<br>");
String header3=req.getHeader("Host");
out.println("獲取HTTP頭文件中Host的值"+header3+"<br>");
String IP=req.getRemoteAddr();
out.println("獲取客戶的IP地址"+IP+"<br>");
String clientName=req.getRemoteHost();
out.println("獲取客戶機的名稱"+clientName+"<br>");
String serverName=req.getServerName();
out.println("獲取服務器名稱"+serverName+"<br>");
int serverPort=req.getServerPort();
out.println("獲取服務器的端口號"+serverPort+"<br>");
String s="接受到一個";
String ss="請求,這是對該請求的響應";
out.println("<p>" +s +req.getMethod() + ss+"</p>");
out.println("</body></html>");
}
E:\Myeclipse10\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\EE_6
4: web
下面的代碼是用於建立一個虛擬主機時在tomcat中server.xml中添加的一段代碼
<Host name="www.sina.com" appBase="f:\sina">
<Context path="" docBase="f:\sina\news" />
</Host>
在f盤中建立的sina文件夾中的news子選項裏,建立WEB-INF子文件夾,裏面新建一個web.xml
用於設定默認歡迎界面
在建立虛擬主機時,需要在windows-system32-drivers-etc-hosts中加入 ip 主機名(如 115.14.90.150 www.sina.com)
這樣在IE地址欄中就可以通過 http://www.sina.com:8080/ 訪問自己建立的sina主機了。
5: 加載配置文件,用於連接數據庫等。(這個類不在Servlet類當中,類名UserDao,配置文件 "db.properties")
1)採用類加載器的方式加載配置文件(文件不要太大,否則會溢出)
class UserDao
{
Properties dbconfig=new Properties();
public void update()
{
InputStream in = UserDao.class.getClassLoader().getResourseAsStream("db.properties");
dbconfig.load(in);
system.out.println(dbconfig.getProperty("url")); //url爲配置文件中內容,就是map集合中的name屬性
}
}
2)採用傳統方式 (採用類加載器方法時,對於更新後的數據不能進行同步,因爲類加載器只加載一次,
而通過類加載器的方式獲得配置文件的位置,在通過傳統方式讀取配置文件數據這樣就能讀取更新後的數據!)
class UserDao
{
Properties dbconfig=new Properties();
public void update()
{
String path = UserDao.class.getClassLoader().getResourse("db.properties").getPath();
FileInputStream in = new FileInputStream("path");
dbconfig.load(in);
system.out.println(dbconfig.getProperty("url")); //url爲配置文件中內容,就是map集合中的name屬性
}
}
3)當UserDao中有多個方法要讀取配置文件時,把讀取配置文件的代碼放在static靜態代碼塊中比較好
static
{
try
{
InputStream in = UserDao.class.getClassLoader().getResourseAsStream("db.properties");
dbconfig.load(in);
}
catch(Exception e)
{
throw new ExceptionInInitializerError(e); //要把錯誤拋出去,不能打印
}
}
6. 解決post提交亂碼
在服務器端 request.setCharacterEncoding("UTF-8");
解決get提交亂碼問題
在服務器端 String username = request.getParameter("username");
username = new String(userName.getBytes("ISO-8859-1","UTF-8");
7. javaBean技術
1)javaBean其實就是一個java類。但是有相關的規定
(1)這個類可序列化(能夠持久保存液能恢復狀態),也就是它必須實現java.io.Serializable接口
(2)這個類必須帶有一個無參數的構造方法。
(3)這個類的屬性必須通過使用get、set和其他按標準命名規範來命名的方法操作:若成員變量名是XXX
那麼要有方法:getXXX(),用來獲取屬性;setXXX()用來設置修改屬性。對於boolean類型的成員變量
可以使用is代替get和set類中的方法的訪問。屬性必須都是public的。內種如果有構造方法,那麼這個
構造方法也是Public的,並且是無參數的。
(4)這個類包含所有必須的事件處理方法。
2)在創建有狀態應用程序時,數據管理很關鍵。爲了能智能地管理用戶數據,必須將其置於上下文中,這可以
通過作用域(scope)來實現。在javaBean中有4種作用域用於管理數據:application(應用程序)、
session(會話)、request(請求)、page(頁面)。
(1)page作用域:這個域是4個作用域中範圍最小的一個,他只適用於當前的JSP頁面,當客戶離開這個JSP
頁面時javaBean就會失效。
<jsp:useBean id="Bean-name" class="class-name" scope="page">初始化成員</jsp:useBean>
(2)request作用域:使用jsp的request對象可以獲得另外一個頁面提交給本頁面的信息。
同樣,javaBean的request作用域和request對象有相同的作用域。當JSP頁面分中使用<jsp: forward>操作
指令向另外一個JSP程序或者使用<jsp: include>指令導入另外的JSP頁面時,第一個JSP頁面會把request對象
傳遞到下一個JSP頁面,而屬於request作用域的javaBean類也將伴隨着request對象的送出,而被第二個JSP頁面接收。
使用request的javaBean組件對象使得JSP頁面傳遞信息更容易,但是由於客戶端不能執行JSP程序創建新的javaBean
對象,所以javaBean不能夠由於客戶端與服務器端之間傳遞信息。
<jsp: useBean id="Bean-name" class="class-name" scope="request">初始化成員</jsp: useBean>
request作用域範圍的javaBean對象存儲在當前ServletRequest中,有request範圍的javaBean實例可以在處理請求的
所有JSP頁面中都存在。這個對象只有在請求全部處理完畢後纔會被釋放掉,request範圍的javaBean常用於共享同一次
請求的JSP頁面中。例如判斷用戶登陸功能,如果用戶密碼合法就可以forward到一個合法的頁面中,否則就forward到
一個出錯頁面。當然,轉以後的頁面仍然能夠得到用戶的輸入。
(3)session作用域:例如購物車一般就是放在session中的或者登陸後的用戶信息等也是可以放在session中。
注意:<%@ page %>標籤中不要設置session=false,否則在這個JSP 頁面中session將不會起作用,
在JSP 頁面中,默認session=true,所以可以不必管它了。
<jsp:useBean id="Bean-name" class="class-name" scope="session" >初始化成員</jsp:useBean>
(4)application 作用域 :application作用域範圍的javaBean對所有用戶和所有頁面都起作用,只需創建一次,而且
將會存在於WEB應用程序執行的整個過程中。
application作用域的javaBean對於處理需要對所有用戶和頁面都有效的數據十分有用。
例如:程序中常用的數據庫連接URL、全局的計數器或者是聊天室中人員信息等。
作用域範圍爲application的javaBean對象存儲在ServletContext 中,即application對象,這就意味中javaBean
生存週期是整個應用程序,當web Servlet停止纔會消失。
<jsp:useBean id="Bean-name" class="class-name" scope="application">初始化成員</jsp:useBean>
(5)session作用域的javaBean和application作用域的javaBean可以用在多個頁面,但是session的範圍是在一個會話中,
而application的範圍在整個網站中。
3)JSP頁面通過useBean動作標記調用javaBean。如果JSP頁面要設定javaBean中變量的值,可以通過set方法組;
獲取變量的值,可以通過get方法組。
同樣,也可以通過JSP中動作標記setProperty 來設置javaBean中的變量值,通過getProperty動作標記來獲取變量值。
(1) setProperty 動作標記:
setProperty動作標記在使用之前,需要用useBean動作標記包含一個javaBean。
該標記可通過3中方式設置beans屬性的值,分別爲將beans屬性的值設爲一個表達式的值或字符串、通過http表單
的參數值來設置beans相應的屬性值,以及通過request參數值來設置beans相應的屬性值。
1)設爲一個表達式的值或字符串
字符串賦值如下:
<jsp:setProperty name="bean name" property="property name" value="str" />
表達式賦值如下:
<jsp:setProperty name="bean name" property="property name" value=<%= expression %> />
上述兩個表達式中,name="bean name" 是必須的,用來表明對哪個bean實例執行下面的動作,這個值和
動作<jsp:useBean>中定義的ID必須對應起來,包括大小寫都必須一致。
property="property name"這個屬性也是必須的,用來表示要設置哪個屬性。
value="具體的值" 主要用來指定bean的屬性的值。
2) 通過http表單參數值設置
通過http表單的參數值來設置beans相應的屬性值,要求表單參數的名字必須與beans屬性的名字相同。語法格式如下:
<jsp:setProperty name="bean name" property="*" />
property的值是“*”表示用戶在可見的JSP頁面中輸入的全部值,存儲在匹配的bean屬性中。
匹配的方法是:bean的屬性名稱必須與輸入框的名字相同。
3)通過request參數值設置
要求:request參數名字必須與javabean屬性的名字相同。語法格式如下:
<jsp:setProperty name="beans name" property="property name" param="param name" />
上述代碼中,name表示javabean的ID名稱,property屬性表示javabean中的屬性名稱,param屬性代表了頁面請求的
參數名字。
注意:不能同時使用 param 和value!
通過request給javabean賦值,param對應的是http表單中的文本框的名稱,property對應的是javabean中變量的名稱。
(2) getProperty 動作標記:
getProperty動作標記主要用來提取指定的bean屬性的值,轉換成字符串,然後輸出。該動作標記實際是調用bean的get()方法。
在使用該動作標記之前,必須使用useBean標籤獲得一個javabean實例。該動作標記語法格式如下:
<jsp:getProperty name="beanInstanceName" property="propertyName" />
上述代碼中,name="beanInstanceName"這個屬性是必須的,用來表明對哪個bean實例執行下面的動作,這個值和動作
<jsp:useBean> 中定義的ID必須對應起來,包括大小寫都必須一致。
property="*" | property="propertyName"這個屬性也是必須的,用來表示要獲取哪個屬性。
8.JSP九大隱式對象
request\response\session\application\config\page\out\exception\pageContext
9.使用jstl需要導入jstl.jar 與standerd.jar 兩個包
10.使用ini配置文件連接數據庫的模板代碼
//以下是模板代碼
public static Connection getConnection() throws Exception
{
Properties props = new Properties();
FileInputStream in = new FileInputStream("E:\\Myeclipse10\\haha\\shiyansi\\src\\db.ini");
props.load(in);
in.close();
// String drivers = props.getProperty("SQLServerDriver");
String drivers = props.getProperty("MySQLDriver");
if(drivers != null)
{
// System.setProperty("SQLServerDriver", drivers);
Class.forName(drivers);
}
String url = props.getProperty("MySQLUrl");
String user = props.getProperty("MySQLUser");
String password = props.getProperty("MySQLPsw");
// String url = props.getProperty("SQLServerUrl");
// String user = props.getProperty("SQLServerUser");
// String password = props.getProperty("SQLServerPsw");
return DriverManager.getConnection(url, user, password);
}
11.數據庫分頁
MySql
select * from tableName limit 0,5
SqlServer
select top 5 * from tableName where id not in(select top 0 id from tableName);
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db909?useUnicode=true&characterEncoding=UTF8&useOldAliasMetadataBehavior=true
12.一個bean複製到另一個bean
public static void copyBean(Object src, Object dest)
{
//自定義類型轉換器
ConvertUtils.register(new Converter() {
@Override
public Object convert(Class type, Object value)
{
if(value==null)
{
return null;
}
String str = (String) value;
if(str.trim().equals(""))
{
return null;
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try
{
return df.parse(str);
}
catch(ParseException e)
{
throw new RuntimeException(e);
}
}
}, Date.class);
try
{
BeanUtils.copyProperties(dest, src);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
13. 關於異常:
下層想向上層拋異常,一般都是拋運行時異常-即RuntimeException 只有一種情況拋編譯時異常,那就是向上層傳遞數據(返回值)的時候跑編譯時異常。
14.事務的四大特性(ACID)
1)原子性
2)一致性
3)隔離性
4)持久性
create table test
(
id int primary key auto_increment,
name varchar(20),
money double
);
15. 使用包裝設計模式五部曲:
1、實現與被增強對象相同的接口 BufferedReader
2、定義一個變量記住被增強對象
3、定義一個構造器,接收被增強對象
4、覆蓋需要增強的方法
5、對於不想增強的方法,直接調用被增強對象(目標對象)的方法
1、編寫一個實現tag接口的標籤處理器類
public class ViewIPTag implements Tag {
private PageContext pageContext;
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
JspWriter out = pageContext.getOut();
String ip = request.getRemoteAddr();
try {
out.write(ip);
} catch (IOException e) {
throw new RuntimeException(e);
}
return 0;
}
public int doEndTag() throws JspException {
return 0;
}
public Tag getParent() {
return null;
}
public void release() {
}
public void setPageContext(PageContext arg0) {
this.pageContext = arg0;
}
public void setParent(Tag arg0) {
}
}
2、在web-inf/目錄下新建tld文件,在tld文件中對標籤處理器進行描述
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/itcast</uri>
<tag>
<name>viewIP</name> <!-- 爲標籤處理器類配一個標籤名 -->
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3、在jsp頁面中導入並使用自定義標籤
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/itcast" prefix="itcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>輸出客戶機的IP</title>
</head>
<body>
您的IP是:<itcast:viewIP/>
</body>
</html>
自定義標籤的擴展功能:
控制jsp頁面某一部分內容是否執行。
1.編寫一個類實現tag接口,控制dostarttag方法的返回值,如果這個方法返回EVAL_BODY_INCLUDE,則執行標籤體,如果返回SKIP_BODY,則不執行標籤體
控制整個jsp頁面是否執行。
2、編寫一個類實現tag接口,控制doendtag方法的返回值,如果這個方法返回EVAL_PAGE,則執行標籤餘下的jsp頁面,如果返回SKIP_PAGE,則不執行餘下的jsp
控制jsp頁面內容重複執行。
3.編寫一個類實現Iterationtag接口,控制doAfterBody方法的返回值,如果這個方法返回EVAL_BODY_AGAIN, 則web服務器又執行一次標籤體,依次類推,一直執行到doAfterBody方法返回SKIP_BODY,則標籤體纔不會重複執行。
修改jsp頁面內容輸出。
4、編寫一個類實現BodyTag接口,控制doStartTag方法,返回EVAL_BODY_BUFFERED,則web服務器會創建BodyContent對象捕獲標籤體,開發人員在doendtag方法體內,得到代表標籤體的bodyContent對象,從而就可以對標籤體進行修改。。。。。。操作。
簡單標籤實現頁面邏輯
控制jsp頁面某一部分內容是否執行。
1.在dotag方法裏面不調用jspFrament.invoke方法即可
控制jsp頁面內容重複執行。
1.在dotag方法重複調用jspFrament.invoke方法即可
修改jsp頁面內容輸出
1.在dotag方法調用jspFrament.invoke方法時,讓執行結果寫一個自定義的緩衝中即可,然後開發人員可以取出緩衝的數據修改輸 出
控制整個jsp頁面是否執行。
1.在dotag方法拋SKIPPageException即可,jsp收到這個異常,將忽略標籤餘下jsp頁面的執行
E:\Myeclipse10\MyEclipse 10\configuration\org.eclipse.osgi\bundles\16\1\.cp\lib
1、request:如果客戶向服務器發請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬於用戶看完就沒用的
2、session:如果客戶向服務器發請求,產生的數據,用戶用完了等一會兒還有用,像這樣的數據就存在session域中,像購物數據,用戶需要看到自己購物信息,並且等一會兒,還要用這個購物數據結帳
3、servletContext:如果客戶向服務器發請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在servletContext域中,像聊天數據
演示不同隔離級別下的併發問題
1.當把事務的隔離級別設置爲read uncommitted時,會引發髒讀、不可重複讀和虛讀
A窗口
set transaction isolation level read uncommitted;
start transaction;
select * from account;
-----發現a帳戶是1000元,轉到b窗口
select * from account
-----發現a多了100元,這時候a讀到了b未提交的數據(髒讀)
B窗口
start transaction;
update account set money=money+100 where name='aaa';
-----不要提交,轉到a窗口查詢
2.當把事務的隔離級別設置爲read committed時,會引發不可重複讀和虛讀,但避免了髒讀
A窗口
set transaction isolation level read committed;
start transaction;
select * from account;
-----發現a帳戶是1000元,轉到b窗口
select * from account;
-----發現a帳戶多了100,這時候,a讀到了別的事務提交的數據,兩次讀取a帳戶讀到的是不同的結果(不可重複讀)
B窗口
start transaction;
update account set money=money+100 where name='aaa';
commit;
-----轉到a窗口
3.當把事務的隔離級別設置爲repeatable read(mysql默認級別)時,會引發虛讀,但避免了髒讀、不可重複讀
A窗口
set transaction isolation level repeatable read;
start transaction;
select * from account;
----發現表有4個記錄,轉到b窗口
select * from account;
----可能發現表有5條記如,這時候發生了a讀取到另外一個事務插入的數據(虛讀)
B窗口
start transaction;
insert into account(name,money) values('ggg',1000);
commit;
-----轉到 a窗口
4.當把事務的隔離級別設置爲Serializable時,會避免所有問題
A窗口
set transaction isolation level Serializable;
start transaction;
select * from account;
-----轉到b窗口
B窗口
start transaction;
insert into account(name,money) values('ggg',1000);
-----發現不能插入,只能等待a結束事務才能插入
加入dbcp鏈接池
1.導入jar包
commons-dbcp-1.2.2.jar commons-pool.jar
2、在類目錄下加入dbcp的配置文件:dbcpconfig.properties
3、在jdbcUtils的靜態代碼塊中創建池
private static DataSource ds = null;
static{
try{
InputStream in = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties prop = new Properties();
prop.load(in);
BasicDataSourceFactory factory = new BasicDataSourceFactory();
ds = factory.createDataSource(prop);
System.out.println(ds);
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
java學習筆記(一)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.