* UID速度要比messageID快好多倍,messageID下載的時(shí)候需要解析header里面頭文件,所以費(fèi)時(shí)
少年阿賓那些青春的歲月 |
package org.apache.abin.mail; import java.util.Properties; import javax.mail.FetchProfile; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; import javax.mail.UIDFolder; import javax.mail.URLName; import javax.mail.internet.MimeMessage; import com.sun.mail.pop3.POP3Folder; /** * UID速度要比messageID快好多倍,messageID下載的時(shí)候需要解析header里面頭文件,所以費(fèi)時(shí) * UID接收郵件 * @author abin * 2012-2-15 下午04:33:26 */ public class ReceiveMail { public static void main(String args[]) throws Exception { String host = "POP3.sohu.com";// 【POP3.163.com】 String username = "leeeee";// 【yuxia2217】 String password = "***";// 【........】 Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); FetchProfile profile = new FetchProfile(); profile.add(UIDFolder.FetchProfileItem.UID); profile.add(FetchProfile.Item.ENVELOPE); if (folder instanceof POP3Folder) { POP3Folder inbox = (POP3Folder) folder; Message message[] = inbox.getMessages(); System.out.println("Messages's length: " + message.length); for (int i = 0; i < message.length; i++) { MimeMessage mimeMessage = (MimeMessage) message[i]; String uid = inbox.getUID(mimeMessage); System.out.println("uid=" + uid); int UnreadMessageCount = inbox.getUnreadMessageCount(); System.out.println("UnreadMessageCount="+UnreadMessageCount); int NewMessageCount = inbox.getNewMessageCount(); System.out.println("NewMessageCount="+NewMessageCount); URLName urlName = inbox.getURLName(); System.out.println("urlName="+urlName); } } } } package org.apache.abin.mail; import java.util.Properties; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.MimeMessage; import com.eastelsoft.etos.email.PraseMimeMessage; /** * MessageId接收郵件 * @author abin * 2012-2-16 下午01:24:30 */ public class GetMail { public static void main(String args[]) throws Exception { String host = "POP3.163.com";// 【POP3.163.com】 String username = "liiiii";// 【yuxia2217】 String password = "****";// 【........】 Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); System.out.println("Messages's length: " + message.length); for (int i = 0; i < message.length; i++) { MimeMessage pmm= (MimeMessage) message[i]; System.out .println("Message " + i + " subject: " + pmm.getSubject()); System.out.println("Message " + i + " sentdate: " + pmm.getSentDate()); System.out.println("Message " + i + " form: " + pmm.getFrom()); System.out.println("Message" + i + " sentdate: " + pmm.getSentDate()); System.out.println("Message " + i + " Message-ID: " + pmm.getMessageID()); System.out.println("Message " + i + " reply: " + pmm.reply(true)); } } }
郵件的回復(fù)的代碼很簡單,在迭代郵件的信息的時(shí)候調(diào)用MimeMessage reply = (MimeMessage) messages[i].reply(Boolean ) TRUE 是郵件回復(fù)給發(fā)送者,F(xiàn)ALSE恢復(fù)給所有人。如果要回復(fù)到新的收件人請使用SetReply-to。
同時(shí)可以使用 reply.setSubject(“***”)設(shè)置回復(fù)的標(biāo)題,不設(shè)置的話默認(rèn)是Re: 加上接收到郵件的標(biāo)題。同理,也可以自己設(shè)置正文內(nèi)容。 這里一定要設(shè)置發(fā)送郵件的地址,而且必須要和郵件認(rèn)證的用戶名一致,不然會報(bào)錯(cuò)。 最后調(diào)用Transport.send(reply)將郵件發(fā)出去 注意:1、reply.setFrom() 必須要設(shè)置而且要和郵件認(rèn)證的用戶名一致,不然會報(bào)以下錯(cuò)誤: com.sun.mail.smtp.SMTPSendFailedException: 501 mail from address must be same as authorization user 2、建議使用郵件認(rèn)證登陸郵件服務(wù)器,不然會出現(xiàn)以下錯(cuò)誤: javax.mail.AuthenticationFailedException: failed to connect, no password specified? 3、代碼雖然很簡單,但是程序難免會出現(xiàn)各種異常。如果大家在調(diào)試程序的時(shí)候出現(xiàn)錯(cuò)誤,請給我留言。 給一個(gè)成功例子大家參考:. import java.io.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class ReplyMail { private static final String HOST_NAME = "pop.qq.com"; private static final String SEND_HOST_NAME = "smtp.qq.com"; private static final String PASSWORD = "*******"; private static final String EMAIL_FROM = "flyingsam@qq.com"; private static final String USER_NAME = "flyingsam@qq.com"; private static final String PROTOCOL = "pop3"; private static final String SEND_PROTOCOL = "smtp"; public static void listMail() throws Exception { Properties props = new Properties(); props.put("mail.smtp.host", SEND_HOST_NAME); props.put("mail.pop.host", HOST_NAME); props.put("mail.transport.protocol","smtp"); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(USER_NAME, PASSWORD)); Store store = session.getStore(ReplyMail.PROTOCOL); store.connect(HOST_NAME, USER_NAME, PASSWORD); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message[] messages = folder.getMessages(); InternetAddress address; for (int i = messages.length-1; i >= 0; i--) { address = (InternetAddress)messages[i].getFrom()[0]; if(address != null) { System.out.println(address.getPersonal()); } if (null != address && "秋天的童話".equals(address.getPersonal())) { System.out.println("第" + i + "個(gè):" + messages[i].getSubject()); MimeMessage replyMessage = (MimeMessage) messages[i].reply(false); // replyMessage.setFrom(new InternetAddress(EMAIL_FROM)); replyMessage.setRecipients(MimeMessage.RecipientType.TO, address.getAddress()); replyMessage.setText("這是回復(fù)郵件,不知道能否成功!"); replyMessage.saveChanges(); Transport transport = session.getTransport("smtp"); transport.connect(SEND_HOST_NAME, USER_NAME, PASSWORD); transport.send(replyMessage); System.out.println("回復(fù)成功"); } } folder.close(true); store.close(); } public static void main(String[] args) { try { ReplyMail.listMail(); } catch (Exception e) { e.printStackTrace(); } } } 類SimpleAuthenticator的代碼: public class SimpleAuthenticator extends Authenticator { private String username; private String password; public SimpleAuthenticator(String username, String password) { this.username = username; this.password = password; } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(this.username, this.password); } } Mysql數(shù)據(jù)庫建表語句:
CREATE TABLE `photo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL, `image` blob NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 //DBClassMysql.java 自己添加mysql的java驅(qū)動,要不會報(bào)錯(cuò)的 package com.abin.upload.image; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public final class DBClassMysql { //Mysql private static String driver="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql://localhost:3306/test"; private static String user="root"; private static String password=""; public DBClassMysql ()throws ClassNotFoundException{ } //Mysql public static Connection getMysql(){ Connection conn=null; try{ if(null==conn||conn.isClosed()){ Class.forName(driver).newInstance(); conn=DriverManager.getConnection(url,user,password); } }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); } return conn; } } //ImageServlet.java 保存文件流的servlet package com.abin.upload.image; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Iterator; import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class ImageServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = null; PreparedStatement ps=null; String title = null; int imageLength = 0; byte[] buffer = new byte[imageLength]; InputStream in = null; int total = 0; int once = 0; DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload file = new ServletFileUpload(factory); try { List lst = file.parseRequest(request); Iterator it = lst.iterator(); while (it.hasNext()) { FileItem fileItem = (FileItem) it.next(); if (fileItem.isFormField()) { title = fileItem.getString("UTF-8"); System.out.println("表單數(shù)據(jù)的名稱是:" + fileItem.getFieldName() + ":表單的內(nèi)容是:" + fileItem.getString("UTF-8")); } else { if (fileItem.getName() != null && !fileItem.getName().equals("")) { imageLength = Integer.parseInt(String.valueOf(fileItem .getSize())); in = fileItem.getInputStream(); System.out.println("上傳文件的名稱:" + fileItem.getName()); System.out.println("上傳文件的大小:" + fileItem.getSize()); System.out.println("上傳文件的類型:" + fileItem.getContentType()); System.out.println("上傳文件的類型:" + fileItem.getInputStream()); } String sql="insert into photo (title,image) values (?,?)"; conn=DBClassMysql.getMysql(); ps=conn.prepareStatement(sql); ps.setString(1, title); ps.setBinaryStream(2, in,in.available()); ps.executeUpdate(); } } request.getSession().setAttribute("message", "operate success."); request.getRequestDispatcher("message.jsp").forward(request, response); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ try { if(ps!=null){ ps.close(); } if(conn!=null){ conn.close(); } } catch (Exception e) { e.printStackTrace(); } } } public void destroy() { super.destroy(); } } //web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>com.abin.upload.image.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/ImageServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> //message.jsp WebRoot下面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>servlet upload</title> </head> <body> <%=session.getAttribute("message") %> </body> </html> //index.jsp WebRoot下面 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>servlet upload</title> </head> <body> <form method="post" action="ImageServlet" enctype="multipart/form-data"> 標(biāo)題:<br/> <input name="title" type="text" /><br/> 請選擇您要上傳的圖片:<br/> <input name="myimage" type="file" /><br/> <input type="submit" value="提交" /> <input type="reset" value="重置" /> </form> </body> </html> 準(zhǔn)備工作:要到http://commons.apache.org/fileupload/download_fileupload.cgi下載上傳文件需要的組件類庫并且到
來自: http://hi.baidu.com/yaoweinan/blog/item/710f29f8c2206c2f4e4aea5f.html
如果遇到下面錯(cuò)誤,那么解決辦法是: java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream
簡而言之,是因?yàn)楫?dāng)commons-fileupload包從版本1.0升到1.1時(shí),DeferredFileOutputStream.class被移走了。如果Tomcat使用1.1及其以上版本,你得為它找到這個(gè)類。解決方法: 進(jìn)入目錄:$CATALINA/server/webapps/manager/WEB-INF/lib,檢查是否存在三個(gè)包: commons-io catalina-manager.jar commons-fileupload.jar 如果缺少commons-io,拷一個(gè)過來。 或者直接使用老版本的commons-fileupload.jar 概述 WAP2.0是1.2協(xié)議的升級版本。 WAP2.0 將通過促進(jìn)下一代無線應(yīng)用和終端的發(fā)展從而加快移動互聯(lián)網(wǎng)的發(fā)展進(jìn)程。以下是WAP2.0對無線互聯(lián)網(wǎng)價(jià)值鏈上各環(huán)節(jié)的意義。 終端用戶 WAP2.0是為加強(qiáng)WAP的實(shí)用性而設(shè)計(jì)的,迎合了市場的需求,并且適應(yīng)了當(dāng)前更高帶寬、更快的數(shù)據(jù)傳輸速度、更強(qiáng)大的接入能力和不同的屏規(guī)格大小等最新的行業(yè)發(fā)展趨勢。利用先進(jìn)的網(wǎng)絡(luò)和新增的服務(wù)功能,支持WAP2.0的終端將可以接入到各種基于互聯(lián)網(wǎng)的內(nèi)容、應(yīng)用和服務(wù),我們也可以將這視為從PC非常有價(jià)值的一個(gè)擴(kuò)展。 開發(fā)商由于新的標(biāo)準(zhǔn)支持XHTML,這樣開發(fā)商就可以利用公共的語言基礎(chǔ)和開發(fā)工具編寫PC和WAP客戶通用的應(yīng)用程序,從而縮減開發(fā)費(fèi)用。XHTML的模結(jié)構(gòu)同時(shí)也使得開發(fā)商在更短的時(shí)間更容易地構(gòu)建能在硬件環(huán)境中適應(yīng)變化的應(yīng)用。 通過CSS的應(yīng)用,開發(fā)商可以把一個(gè)或多個(gè)XML文件中的風(fēng)格屬性從實(shí)際內(nèi)容中分離出來,從而縮減貯存在瀏覽器記憶中標(biāo)識語言代碼的容量。 終端制造商終端制造商將可以借新技術(shù)開發(fā)的機(jī)會研發(fā)制造支持優(yōu)化的WAP應(yīng)用的手機(jī)終端。新手機(jī)的功能將可以包括彩色顯示、多媒體信息、大容量文件的下載、改良的導(dǎo)航功能和友好的用戶菜單等。 網(wǎng)絡(luò)運(yùn)營商WAP2.0將為移動網(wǎng)絡(luò)運(yùn)營商帶來巨大的利益。網(wǎng)絡(luò)商將利用WAP2.0的技術(shù)優(yōu)勢開發(fā)更加有吸引力的新服務(wù)。這些新服務(wù)將具備促進(jìn)用戶使用量的巨大潛力,為移動網(wǎng)絡(luò)商在2.5G和3G網(wǎng)絡(luò)中的投資帶 WAP2.0受到業(yè)界的廣泛支持 “GSM協(xié)會非常歡迎WAP2.0的標(biāo)準(zhǔn)協(xié)議,并且對WAP語言向 XHTML標(biāo)識語言發(fā)展的方向表示贊許”, GSM協(xié)會的CEO--Rob Conway說,WAP標(biāo)準(zhǔn)持續(xù)發(fā)展的重要性不可忽略--WAP2.0將使發(fā)展商更加容易地在移動互聯(lián)網(wǎng)上構(gòu)建更加引人注目的移動應(yīng)用。“WAP2.0的發(fā)布還將對移動商務(wù)的發(fā)展和普及進(jìn)程帶來重大的影響”。 據(jù)悉,三大手機(jī)制造廠商N(yùn)okia、愛立信以及Motorola公司也聲稱將在下一代手機(jī)產(chǎn)品中支持最新版本的WAP協(xié)議。 技術(shù)的演變和WAP2.0帶來的利益隨著WAP日益向互聯(lián)網(wǎng)規(guī)范的靠攏和融合,最新的版本W(wǎng)AP2.0將全面支持:XHTML,TCP/IP, 超文本傳輸協(xié)議 (HTTP/1.1), 和 傳輸層安全(TLS)。 利用W3C開發(fā)的標(biāo)準(zhǔn),WAP采用了XHTML 和 CSS作為WML2.0的一部分,以減少創(chuàng)建和測試為不同終端開發(fā)應(yīng)用和操作內(nèi)容所需要的時(shí)間。在協(xié)議層,WAP2.0采用了IETF以下的規(guī)范:在傳輸層,WAP2.0支持TCP/IP,實(shí)現(xiàn)在IP網(wǎng)絡(luò)上傳輸數(shù)據(jù)的能力。在session層,WAP 2.0采用HTTP/1.1作為協(xié)定。此外,WAP2.0還加強(qiáng)了傳輸?shù)陌踩阅埽@包括TLS協(xié)議的采用,保證了更可靠的端到端安全,結(jié)合有線網(wǎng)絡(luò)的安全措施,使得移動商務(wù)、移動銀行應(yīng)用和相關(guān)服務(wù)的提供變得更加安全可靠。 對WAP2.0來說,可以顯著提高用戶體驗(yàn)的新技術(shù)主要包括數(shù)據(jù)同步功能、多媒體信息(MMS)、穩(wěn)定的存儲界面、Provisioning 以及 Pictograms。此外的WTA(Wireless Telephony Application )、push、和UAPROF (vser Agent Profile) 也將使WAP2.0具備比以往版本更加先進(jìn)的功能。 功能和應(yīng)用*WAP2.0的數(shù)據(jù)同步特色采用了SyncML協(xié)議,為不同的終端提供通用的解決方案框架--SyncML同時(shí)支持WSP(Wireless Session Protocol)和HTTP/1.1協(xié)議。 *MMS為開發(fā)支持更豐富的信息服務(wù)提供了基礎(chǔ)架構(gòu)。基于MMS的信息服務(wù)將使短信更加的多采,更加趨向個(gè)性化。 *穩(wěn)定的存儲界面為終端用戶提供了一套完整的存儲服務(wù),包括在無線終端上的信息管理、接入、 儲存和獲取。 *“Provisioning”使得網(wǎng)絡(luò)運(yùn)營商可以通過一套通用的工具管理網(wǎng)絡(luò)覆蓋下的移動終端設(shè)備。 *而“Pictogram”將允許一些小圖象的傳輸,這是對傳統(tǒng)的語言傳送的一個(gè)跨越。 *PUSH技術(shù)允許值得信任的應(yīng)用服務(wù)器向終端用戶發(fā)送個(gè)性化的內(nèi)容,例如用戶可能會感興趣的打折銷售信息、新郵件到達(dá)提醒、或者本地的促銷信息。push 技術(shù)是對傳統(tǒng)互聯(lián)網(wǎng)“pull”模式的有效補(bǔ)足。 *UAPROF使得應(yīng)用服務(wù)器非常“聰明”地向用戶發(fā)送適當(dāng)?shù)膬?nèi)容,并且可以自動識別終端的性能,譬如屏幕的大小和顏色、最大運(yùn)行能力等,提高服務(wù)的人性化程度。 *WTA提供了應(yīng)用服務(wù)環(huán)境內(nèi)先進(jìn)的電話服務(wù)。當(dāng)用戶在進(jìn)行數(shù)據(jù)操作時(shí),可以非常方便地進(jìn)行撥叫和應(yīng)答電話、來電等待、來電轉(zhuǎn)接等功能的操作。這些新服務(wù)的提供使運(yùn)營商將可以為客戶提供獨(dú)特的用戶操作界面去控制復(fù)雜的網(wǎng)絡(luò)功能。
1.hibernate的優(yōu)缺點(diǎn)
1.sql語句不用寫了,它使用時(shí)只需要操縱對象,使開發(fā)更對象化,為我們提高了生產(chǎn)力; 2.移植性會很好; 3.它實(shí)現(xiàn)了透明持久化,如POJO,這個(gè)對象沒有實(shí)現(xiàn)第三方框架或者接口; 4.它沒有侵入性,即所謂的輕量級框架; 5.對象之間有很清晰的關(guān)系 一般場合: 針對某一對象(單個(gè)對象)簡單的查\改\刪\增,不是批量修改、刪除,適合用Hibernate; 而對于批量修改、刪除,不適合用Hibernate,這也是OR框架的弱點(diǎn); 要使用數(shù)據(jù)庫的特定優(yōu)化機(jī)制的時(shí)候,不適合用Hibernate 2.hibernate的工作原理 1.配置好hibernate的配置文件和與類對應(yīng)的配置文件后,啟動服務(wù)器 2.服務(wù)器通過實(shí)例化Configeration對象,讀取hibernate.cfg.xml文件的配置內(nèi)容,并根據(jù)相關(guān)的需求建好表或者和表建立好映射關(guān)系 3.通過實(shí)例化的Configeration對象就可以建立sessionFactory實(shí)例,進(jìn)一步,通過sessionFactory實(shí)例可以創(chuàng)建 session對象 4.得到session之后,便可以對數(shù)據(jù)庫進(jìn)行增刪改查操作了,除了比較復(fù)雜的全文搜索外,簡單的操作都可以通過hibernate封裝好的 session內(nèi)置方法來實(shí)現(xiàn) 5.此外,還可以通過事物管理,表的關(guān)聯(lián)來實(shí)現(xiàn)較為復(fù)雜的數(shù)據(jù)庫設(shè)計(jì) 優(yōu)點(diǎn):hibernate相當(dāng)于java類和數(shù)據(jù)庫表之間溝通的橋梁,通過這座橋我們就可以做很多事情了 Hibernate 的初始化. 讀取Hibernate 的配置信息-〉創(chuàng)建Session Factory 1)創(chuàng)建Configeration類的實(shí)例。 它的構(gòu)造方法:將配置信息(Hibernate config.xml)讀入到內(nèi)存。 一個(gè)Configeration 實(shí)例代表Hibernate 所有Java類到Sql數(shù)據(jù)庫映射的集合。 2)創(chuàng)建SessionFactory實(shí)例 把Configeration 對象中的所有配置信息拷貝到SessionFactory的緩存中。 SessionFactory的實(shí)例代表一個(gè)數(shù)據(jù)庫存儲員源,創(chuàng)建后不再與Configeration 對象關(guān)聯(lián)。 緩存(cache):指Java對象的屬性(通常是一些集合類型的屬性--占用內(nèi)存空間。 SessionFactory的緩存中:Hibernate 配置信息。OR映射元數(shù)據(jù)。 3)調(diào)用SessionFactory創(chuàng)建Session的方法 1】用戶自行提供JDBC連接。 Connection con=dataSource.getConnection(); Session s=sessionFactory.openSession(con); 2】讓SessionFactory提供連接 Session s=sessionFactory.openSession(); 4)通過Session 接口提供的各種方法來操縱數(shù)據(jù)庫訪問。 Hibernate 的緩存體系 一級緩存: Session 有一個(gè)內(nèi)置的緩存,其中存放了被當(dāng)前工作單元加載的對象。 每個(gè)Session 都有自己獨(dú)立的緩存,且只能被當(dāng)前工作單元訪問。 SessionFactory的外置的可插拔的緩存插件。其中的數(shù)據(jù)可被多個(gè)Session共享訪問。 SessionFactory的內(nèi)置緩存:存放了映射元數(shù)據(jù),預(yù)定義的Sql語句。 Hibernate 中Java對象的狀態(tài) 1.臨時(shí)狀態(tài) (transient) 1】不處于Session 緩存中 2】數(shù)據(jù)庫中沒有對象記錄 Java如何進(jìn)入臨時(shí)狀態(tài) 1】通過new語句剛創(chuàng)建一個(gè)對象時(shí) 2】當(dāng)調(diào)用Session 的delete()方法,從Session 緩存中刪除一個(gè)對象時(shí)。 2.持久化狀態(tài)(persisted) 1】處于Session 緩存中 2】持久化對象數(shù)據(jù)庫中設(shè)有對象記錄 3】Session 在特定時(shí)刻會保持二者同步 Java如何進(jìn)入持久化狀態(tài) 1】Session 的save()把臨時(shí)-》持久化狀態(tài) 2】Session 的load(),get()方法返回的對象 3】Session 的find()返回的list集合中存放的對象 4】Session 的update(),saveOrupdate()使游離-》持久化 3.游離狀態(tài)(detached) 1】不再位于Session 緩存中 2】游離對象由持久化狀態(tài)轉(zhuǎn)變而來,數(shù)據(jù)庫中可能還有對應(yīng)記錄。 Java如何進(jìn)入持久化狀態(tài)-》游離狀態(tài) 1】Session 的close()方法 2】Session 的evict()方法,從緩存中刪除一個(gè)對象。提高性能。少用。 2.異常的種類運(yùn)行時(shí)異常是系統(tǒng)運(yùn)行時(shí)發(fā)出的異常,程序員控制不了的,這類異常不需要try,catch和throws exception語句,是由java虛擬機(jī)拋出的,并且自動捕獲拋出的main方法 中,我們 不能對這個(gè)異常進(jìn)行處理,它會直接終止程序。一般遇到的就是空指針異常,數(shù)組越界異常等,這些異常一般是我們可以在前臺控制臺可以看到的,相信你也看到過吧。 受檢測異 常指的就是我們可以處理的異常,我們可以通過try catch語句捕獲并且處理(也可以不處理直接向上層拋出),處理之后程序還可以繼續(xù)執(zhí)行,不會終止程序,如果每一 層都每一 處理,則會終止程序。 4.hibernate的緩存機(jī)制一級緩存 指的是session(對數(shù)據(jù)進(jìn)行增刪查改) 二級緩存 值的是sessionfactory,對一些數(shù)據(jù)庫進(jìn)行變化的時(shí)候 主要是為了減少資源浪費(fèi),對一些不經(jīng)常改變的數(shù)據(jù)進(jìn)行緩存,select * from 這種的語句就是為了減少無謂的浪費(fèi)資源
摘要: 接口選擇: osworkflow提供幾種實(shí)現(xiàn)com.opensymphony.workflow.Workflow接口的類。 BasicWorkflow: 不提供事務(wù)支持,你可以通過持久層來實(shí)現(xiàn)事務(wù)處理。 Workflow wf = new BasicWorkflow(username) 這里的username是用來關(guān)聯(lián)當(dāng)前請求的用戶。 EJ... 閱讀全文
//web.xml <?xml version="1.0" encoding="UTF-8"?>
//struts-config.xml這個(gè)放置在src目錄下面 <?xml version="1.0" encoding="UTF-8"?> <struts-config> //UserAction.java package com.abin.struts1.action; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionForm; import com.abin.struts1.form.UserForm; public class UserAction extends DispatchAction { public ActionForward user(ActionMapping mapping, ActionForm form, } //UserForm.java package com.abin.struts1.form; import org.apache.struts.action.ActionForm; public class UserForm extends ActionForm{ //index.jsp這個(gè)放置在WebContent下面(我這里使用的eclipse,如果是Myeclipse就直接放置在WebRoot下面) <%@ page language="java" contentType="text/html; charset=utf-8" //add.jsp這個(gè)放置在WebContent下面(我這里使用的eclipse,如果是Myeclipse就直接放置在WebRoot下面) <%@ page language="java" contentType="text/html; charset=utf-8" function CreateXmlRequest(){ function CreateAdd(){ 1、struts2代碼: Map session=ActionContext.getContext().getSession(); List<User> list=userServiceImpl.listUser(); //list.jsp <s:iterator value="#session.list" id="li" status="st" var="x"> <a href="update.jsp?id=<s:property value='id' />" href="_blank">修改</a> <br/>
2、struts2代碼 HttpServletRequest request=ServletActionContext.getRequest(); List<User> list=userServiceImpl.listUser(); //list.jsp <s:iterator value="#request.list" id="li" status="st" var="x"> <a href="update.jsp?id=<s:property value='id' />" href="_blank">修改</a> <br/>
3、struts2代碼: Map session=ActionContext.getContext().getSession(); List<User> list=userServiceImpl.listUser(); //list.jsp <s:iterator value="#session.list" id="li" status="st" var="lee"> <a href="update.jsp?id=<s:property value='#lee.id' />" href="_blank">修改</a> <br/>
4、struts2代碼 HttpServletRequest request=ServletActionContext.getRequest(); List<User> list=userServiceImpl.listUser(); //list.jsp <s:iterator value="#request.list" id="li" status="st" var="lee"> <a href="update.jsp?id=<s:property value='#lee.id' />" href="_blank">修改</a> <br/> |