java學習筆記(一)

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);
		}
	}






發佈了14 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章