新东方学习笔记1

    技术2022-05-11  139

    java笔记:

    (1):java中是以long形保存日期数据的。import java.sql.Date;long time = System.currentSysteTime();Date d = new Date(time);System.out.println(d);//2005-10-26/

    (2):处理数据库中的nullResultSet rs = stmt.exexuteQuery("select age a from dog");while(rs.next()){ rs.getInt("a"); rs.wasNull(); //true or false?}/

    (3):servlet是单实例,多线程。1,第一次用户发出请求,WEB容器创建servlet对象(一个servlet仅创建一个对象,供所有用户

    调用) 。容器调用init()方法。2,以后用户发出请求后,WEB容器就会调用servert的doGet()或doPost()方法。3,销毁对象是,先调用destroy()方法,然后销毁对象。

    servlet是单实例多线程的,所以在调用doGet()和doPost()方法时需要考虑多线程。需要在方法

    前加 上线程锁。synchronized 和在方法体中加上Thread.sleep(100);这样就可以避免多用户同时修

    改同一 变量了。/

    (4):Response:response.setContentType(),// "text/html"PrintWriter out = response.getWriter().//将把要显示到页面的内容写到流中

    Request:request.getRemoteAddr(),//取得请求地址 172.16.7.16request.getHeader("");//获取协议头 ,以键值方式 例:key - valuerequest.getHeaderNames();//获取所有协议头信息  显示好多东西啊!

    String id = request.getParaments("id");//获取浏览器端传过来的id键值Enumeration names = request.getParameterNames();//获得所有的键值对

    网页提交一般默认是以'post'方式提交。所以一般在servlet中复写doPost()方法。jsp将提交信息提交给 servlet,需要在jsp的提交form中写上指定的servlet。<form

    name="form1"  method="post" action="servlet"></form>'servelt'与配置文件(web.xml)中的 <url-pattern>/servlet</url-pattern>相同。

    jsp放置路径与'WEB-INF'在同级目录。/

    (5):重定项:浏览器将请求(request)给程序1,程序1 response到浏览器,浏览器根据程序1 response回的信息

    (去找 程序2)。浏览器又request到程序2,程序2又response到浏览器。requst.getPartment("name");//不可以response.sendRedirect("success.jsp");//可以

    转发:浏览器将请求(request)给程序1,程序1又将请求(request)给了程序2,程序2直接response到浏览

    器。程序2: requst.getPartment("name");//可以response.sendRedirect("success.jsp");//可以/

    (6):servelt中可以处理浏览器端传来的cook。

    取得cook信息:Cookid cookid = new Cookid("key","value");Cookie[] cookies = request.getCookies();加入cook信息:Date date = new Date();String s = String.valueOf(date.getTime());Cookid cookie = new Cookie(s,s);response.addCookie(cookie);cookid.setMaxAge(100);//设置cookid生命期/

    (7):每一个session对像都有一个session id.通过sessionid来区别对象。sessionid作为会话cookie保存到浏览器端。记录用户访问信息。用户关闭浏览器,一般都清除 sessionid信息。

    HttpSession session = request.getParameter(true);//用户获取session对象//session 是以键值对出现的session.setAttribute("username",name);在jsp中写Objectg obj = session.getAttribute("username");if(obj != null){ String name = (String)obj;}/

    (8):共享数据request,session,ServletContext中都可以放数据request:同一个请求。'重定项'可以,'转发'不行。session:同一个会话可以。ServletContext:同一个application中都可以。

    例:HttpSession session = request.getSession(true);//不存在创建个新的request.setAttribute("request","request");session.setAttribute("session","session");response.sendRedirect("target.jsp");//从定项

    Object se = session.getAttribute("session");Object re = request.getAttribute("request");out.print("session = "+se);out.print("request = "+re);

    //转发RequestDispatcher rd = request.getRequestDispatcher("target.jsp");//转发rd.forward(request,response);

    ServletContext ctx = getServletContext();//Context放入整个应用的共享数据ctx.setAttribute();Object obj = ctx.getAttribute("num");int n=1;if(obj == null){ ctx.setAttribute("num",new Integer(n));}else{ n = ((Integer)obj).intValue(); ctx.setAttribute("num",new Integer(n+1));}/

    (9):一个用户登录,注册 的程序。用 jsp,servlet,select count(*) from user where name = 'name' and pass = 'pass';判断结果是  0/1

    int i = 8888888888; //不对long l = 8888888888; //不对long l = 8888888888l; //对 8888888888后什么也不写,默认是int型,int长度放不下长度。/

    (10):ServletConfig :部署描述符在servlet配置文件中写入信息<servlet><init-param> <param-name>driver</param-name> <param-value>jdbc.oracl.OracleDriver</param-value></init-param><init-param> <param-name>url</param-name> <param-value>jdbc:oracle:thin:@localhost:1521:ORA001</param-value></init-param></servlet>

    private String url;private String driver;public void init(){ ServletConfig config = this.getServletConfig(); driver = config.getInitParameter("driver");//获取初始化参数  url = config.getInitParmeter("url");//}/

    (11):

    ListList 和ArrayListArrayList: 是用动态数组写的。里面使用视图原理,适合查询。ListList: 是用链表写的。适合插入,删除。/

    (12):过滤器:

    浏览器请求首先调用service()方法,这个方法决定调用 ->doGet() 或 doPost()。在配置文件中学禁止内容<filter> <filter-name>forbit</filter-name> <filter-value>***</filter-value></filter>

    forbitname = config.getInitParameter("forbit");

    doFilter(request,response,chain)String name  = request.getParameter("username");if(name != null && name.indexOf(forbitname) != -1){ return;}chain.doFilter(request,response);/

    (13):标签库JSFJSTLSTRUTS

    使用标签库,提高效率。/

    (14):jsp用jbuilder 2005开发jsp,在'Welcome files'上点击'add'加入欢迎界面。在web.xml中  <welcome-file-list>    <welcome-file>jsp1.jsp</welcome-file>  </welcome-file-list>

    在jsp中写上<%@page language="java"%>//设置语言           <%@page import="java.util.*,java.text.*"%>    <%@page pageEncoding="GBK"%>//编码格式    <%@page errorPage="error.jsp"%>//错误页面,只要出错,就跳转到该页面

    tomat 下的work/Catalinal/localhost/TestJSP/org/apache/jsp 下是jsp被编译成的servlet页

    面。

    jsp中写入以下内容<%! int i=0;%>//servlet类的成员变量<% int i=0;//service()方法的局部变量 i ++; j ++; %>request.getParament("");//request是jsp中的内置对象,不用定义out.println("");//out是jsp中的内置对象,不用定义/

    (14)'abc中国人'uncold是6在内存中是9fileWrite: 调用后是9/

    (15)强制类型语言

    <script type="" language="JavaScript"> function check(){  var v = parseInt(f1.times.value);  if(!isNaN(v) && v>=1 && v<=99){  return true;  }else{  alert("1~99");  return false;  } }</script>/

    (16)格式化日期对象String format(Date date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String s  = sdf.format(date); return s;}/

    (17)接口 Collection 是超接口,其他容器都继承它子接口 Set //集合,无序的子接口 List //链表,有序

     实现类 HashSet  ArrayList  //动态数组 LinkedList//链表

    接口 Map 放的是键值对 实现类HashMap

    Hashtable //相当与旧版本的 Hashmap          //Hashmap是同步类Vector    //相当与ArrayList,LinkedList   //vector是同步类,而另外两个没有同步,考虑到了性能

    StringBuffer //实现了同步,是线程安全的,在多线程中用StringBuilder//不是线程安全的,在单线程中用/

    (18)重写类时需要重写以下方法String toString(){}boolean equal(Object){}int hashCode(){}两个对象如果equal()返回ture,则hashCode()返回的整形也要相等。

    两个对象相等的条件是 他们的hashCode值相等,equal相等

    若不重写 hashCode 则默认的是对象地址的值。/

    (19)Collections是个实现类Collections.sort((List)c1); //c1是arraylist要排序对象,需要在对象中实现compareTo()方法。Coolection c5 = Cllections.synchronizedCollection(c1);//c5指向c1/

    (20)Iterator 为容器实现了统一的遍历方法。/

    (21)javabean获得列表public Collection getConrseList(){ String sql = ""; Connection con = getConnection(); PrepareStatement prepStmt = con.prepareStatement(sql); ResultSet rs = prepStmt.executeQuery(); Collection courses = new ArrayList(); while(rs.next()){ String id = rs.getString("id"); String name = rs.getString("name"); Course course = new Course(); course.setId(id); course.setName(name); courses.add(course); } return courses;}/

    (22)调用错误页面error.jsp<%page isErrorPage="true"%><% exception.getMessage();//exception是jsp内置对象,保存异常信息%>/

    (23)数据库连接和关闭都要消耗性能,所以要有连接池。连接池一般是在一启动,就创建一定数量的对象供使用,用户用到对象时,只需从池中拿来即可

    (24)链表可以通过键来获得。Collections.sort(lsit);//对list排序Collections.binarySearch(list,'abc');//折半查找

    Map map = new HashMap();//键值对 以hash表的方式存放map.put("one",new Integer(1));map.put("two",new Integer(2));map.put("three",new Integer(3));

    boolean b = map.containKey("one");//true

    SET遍历Set keys = map.keySet();//把键作为集合返回Iterator it = keys.iterator();while(){}

    (25)Reader和Writer  专门用来处理文本类型的数据,和编码有关。 //字符数据InputStream和OutputStream  //字节型数据

    直接跟数据源相连的流叫'节点流'。

    节点流 Fis Fos字符流 BAIS BAOS

    缓冲流 Bis Bos数据流 Dis Dos对象流 Ois Oos

    字符缓冲流 FR RW           BR BW转换流 OutputStreamWriter InputStreamReader

    PipedInputSteam PipedOutSream

    PrintSteam PrintWriter

    ...stream是处理数据的专门处理字符串用字符流,涉及到编码问题,字符流可以解决转换问题。

    //写字节byte型FileOutStream fos = new FileOutPutStream("c://temp//a.txt");FileInputSteam fis = new FileInputSream("c://temp//b.txt");int b = fis.read();//读一个字节,读的是低8位fos.write(100);//写低8位,写整形不用转换了

    byte[] buffer = new byte[1024];//处理读取效率while((b = fis.read(buffer)) != -1){//是否读到文件末尾,b表示读取的有效数 fos.write(buffer,0,b);//}如果buffer很到会又问题。所以用缓冲流来解决BufferOutputStream bos = new BufferedOutputSteam(fos);BufferInputStream bis = new BufferedInputSteam(fis);int b = -1;while((b = bis.read()) != -1){ bos.write(b);}数据流DateOutputSteam dos = new DateOutputSteam(new FileOutputSteam("c.dat"));dos.writeInt(100);dos.writeDoubls("123.456");dos.close();

    DateInputSream dis = new DateInputSream(new FileInputStream("c.dat"));

    String s = "abc中国人";OutputSteamWriter osw = new  OutputSteamWriter(new FileOutputStream("abc.txt"));osw.write(new char[]{'a','b','c'});//输出文件大小4

    OutputSteamWriter osw = new  OutputSteamWriter(new FileOutputStream("abc.txt"));osw.write("中");//输出文件大小1

    Write(int)方法写入低16位,前16以0补充,Writer再调用本地编码规范,写到文件中

    unicode :所以都是2位iso8859 :国际标准ascode  :只能是键盘上的字符gbk,gb2312:英文是1字节,汉子是2字节UTF:英文是1字节,汉字、日文是3字节

    FileWrite fw = new FileWrite("abc.txt");//只能按默认编码//相当于 //OutputSteamWriter osw = new  OutputSteamWriter(new //FileOutputStream("abc.txt"));

    fw.write(new char[]{'a','b','中'});fw.close();osw.close();//文件大小4字节

    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

    (26)JSP内置标签

    1、标签可以嵌入其他标签,可以由自己的属性2、前面的jsp:前缀 -》可以解决命名问题。3、和html中的标签不一样,jsp标签所对应的是一段代码,具有一定功能。可以自己定义自己的

    标签 ,使jsp中不存在逻辑代码。

    a.jsp<jsp:include page="b.jsp" flush="false"></jsp:include>

    把另外一个页面嵌入到jsp页面中    fulsh的属性是表示将缓存中的数据写到浏览期上。a.jsp向缓冲中写数据,然后b.jsp再向

    缓冲中 写数据,返回到a.jsp,再向同以缓冲区中写数据。'false'表示将缓冲中的数据一起写到浏览器

    上 ,'true'表示在转给b.jsp时,先将缓冲区的数据写到浏览器端,清空缓冲,然后b.jsp将数据写

    到缓冲 中,再返回到a.jsp    浏览器向a.jsp发出请求(request,response),a.jsp进行处理,又对请求

    (request,response) 进行一些处理,发给b.jsp.

    a.jsp<jsp:forward page="b.jsp"> <jsp:param name ="name" value="java"/></jsp:forward>b.jsp可以过 request.getArrtibute("v"); request.getParameter("name");页面转发a.jsp的数据放到缓存中,数据不输出(输出抛异常),转到b.jsp

    <%@page buffer="none"%>

    servlet://out.flush(); //清缓存将抛异常System.out.println(response.isCommitted());RequestDispatcher rd = request.getRequestDispatcher("success.jsp");rd.forward(request,response);

    redirect:可以重定项到任何地方forward :只能转到本应用内部include :只能包括本应用中的

    (27)jsp共享数据级别Object obj0 = pageContext;Object obj1 = request;Object obj2 = session;Object obj3 = application;

    Class c0 = pageContext.getClass();Class c1 = request.getClass();Class c2 = session.getClass();Class c3 = application.getClass();

    c0.getName();//weblogic.servlet.jsp.PageContextImplcl.getName();//weblogic.servlet.internal.ServletRequestImplc2.getName();//weblogic.servlet.internal.session.MemorySessionDatac3.getName();//weblogic.servlet.internal.WebAppServletContext

    getName();//返回的是实现类

    page<request<session<applicationpage:本页面级别request:多个页面可以共享,只要是同一个请求范围session:只要是一个会话(浏览器不关)application:只要是一个应用(服务器不关)

    已经学了以下jsp内置对象page<request<session<applicationexception,out,forward

    (28)涉及到本地比较多,离操作系统比较近,cs结构用的java.newio.*;包比较多。(29)解决 Netscape 浏览器屏蔽cooked的问题。浏览器发送消息到服务器端(session对象默认为session="true"),如果是第一次访问,服务器

    创建创 建一个新的session对象。然后将sessionid写到访问览器上。

    session.invalidate();//session对象失效。

    String loginURL = response.encodeURL("longin.jsp");String loginURL = response.encodeURL("longout.jsp");//检测session是否可用

    (30)//java反射 //要求类必须有空构造子Class c = Class.forName("test.jsp.bean.TestBean");//封装类Object obj = c.newInstance();//创建实例,调用空构造子System.out.println(obj);

    //活得方法Method m = c.getMethod("setStringV",new Class[] {String.class,Integer.class});//class.forName("test.A") 等同于 A.class;m.invoke(obj,new Object[]{"java"});public void setStringV(String str,Integer i){}

    (31)<jsp:useBean id="somebean" scope="page" class="teset.jsp.bean.TestBean"> <jsp:setProperty name="somebean" property="stringV" value="j2ee"/> //标签 初始化属性 progerty于javabean中的get,set后面的名相同 //调用(stringV)setStringV()方法。 //从小到大page->request->session->application</jsp:useBean>//可以创建这个TestBean对象,然后以id的名称,存到scope指定的范围里面。//jsp中是用反射机制实现对象创建的

    //打印属性

    <jsp:getProperty name="somebean" property="stringV"/>等同于<%=somebean.getStringV()%>

    (32)装饰模式

    (33)java安全:

    import java.security.MessageDigest;public static void main(String[] args){ MessageDigest md = MessageDigest.getInstance("MD5");//采用MD5算法进行加密,

    屏蔽创 建对象的复杂性 String password = "java"; byte[] b = password.getBytes(); byte[] b1 md.digest(b); for(int i=0;i<b1.length;i++){  System.out.println(b1[i]); }}

    BufferedInputStream bis = new BufferedInputStream(new  FileInputSteam("c://temp//abc.txt")); int b =-1;while((b=bis.read())!=-1){ md.update((byte)b);} byte[] b2 = md.digest(); for(int i=0;i<b2.lenth;i++){ System.out.print(b2[i]+" ");}(34)

    日志:log4j1,改变输出权限2,改变输出平台3,改变输出格式

    Logger  //可以有不同的 Appender(console)->Layout(SimpleLayout) Appender(file) -> PatternLayout Appender(...)-> ...

    使用Log4J配置文件配置Logger,Appender和Layout组建##LOGGERS##log4j.logger.testerLogger=WARN,console,file //指定logger定义名称 ,指定级别,输出平

    台 (console,file)(下面定义)

    ##APPENDERS##log4j.appender.console=org.apache.log4j.ConsoleAppender //指定对应类log4j.appender.file=org.apache.log4j.FileAppender //指定对应类log4j.appender.file.File=log.txt //指定输出文件名##LAYOUT##log4j.appender.console.layout=org.apache.log4j.SimpleLayout //指定输出格式log4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%p-%m%n

    import org.apache.log4j.*;

    public static void main(String[] args){ PropertyConfigurator.configure("c://temp//log4j.properties");//读取属性文件 Logger logger = Logger.getLogger("testerLogger");//选择Logger

     logger.fatal("fatal"); logger.error("error'); logger.warn("warn");//产生一个级别为警告的日志 logger.info("info"); logger.debug("debug");}(35)标签库需要引入 improt javax.servlet.jsp.*;import javax.servlet.jsp.tagext.Tag;继承 TagpageContext : 一个页面也个pageContext,这个方法包含页面的所有信息application - serveltContext

    setParent: 设置上标签(外层标签)值。getParent: 得到该标签,供容器使用。

    doStartTag():遇到标签头(<)时调用。doEndTag():遇到标签尾(>)时调用。

    JspWriter out = pageContext.getout();//获取输出流

    定义.tld<taglib>//根元素 <tlibversion>1.0</tlibversion> //标签版本号 <jspversion>1.1</jspversion> //jsp版本号 <shortname>test</shortname>  <uri>/test</uri> //uri,供web.xml引入 <tag>  <name>hello</name>  <tagclass>test.jsp.tag.HelloTag</tagclass>  <bodycontext>empty</bodycontext>  <attribute>   <name>num</name> //属性名   <required>ture</required> //是否必须写   <rtexprvalue>true</rtexprvalue>  </attribute> </tag></taglib>

    在web.xml中对标签进行定义//必须放在最后<taglib> <taglib-uri>/test</taglib> <taglib-location>/WEB-INF/testtag.tld</taglib-location></taglib>// web.xml循序时一定的

    在jsp中指定标签<%@taglib uri="/test" prefix="t"%>页面中写<t:hello>

    1,写标签库2,定义.tld3,添加web.xml4,jsp中引入自己定义标签库

    (36)pageContext

    pageContext.setSAttribute("","");request.setAttrbute("","");session.setAttrbute("","");application.setAttrbute("","");

    Object obj = pageContext.findAttrbute("");//查找键值,依次 page,request,session.application

    pageContext.getAttrbute("some_key",pageContext.SESSION_SCOPE);//在pageContext中获得

    值,后 面指定查找范围

    pageContext.getAttributeNamesInScope(pageContext.PAGE_SCOPE);//pageContext中的所有键

    EVAL_BODY_INCLUDE //执行body内容SKIP_BODY //跳过bodyEVAL_PAGE //执行标签后面的东西

    (37)标准标签库 JSTLcore  out set.remove if.choose.when.otherwrise forEach.forTokens import.redirect.url.param

    <c:out value="hello"/> //输出 hello escapeXml默认是true<c:out value="<b>hello</b>" escapeXml="true"> //输出 <b>hello</b><c:out value="<b>hello</b>" escapeXml="false"> //输出 hello

    <c:out value="${1+2}"/>  //${n} 表达式 ,n是一个变量<c:out value="${request_key}"/>  //在 page->request->session->application依次查找

    <c:out value="${key_1} default="default_values_1"/>等同<c:out value="${key_1}"> default_value_1</c:out>//先找key_1,若未找到则用缺省值

    set:<c:set value="hello" var="v1" scope="page"/>//设置(键)v1为hello, = pageContext.setAttribute("var","hello");

    <c:set value="${requestScope.some_key} var="v2"/>//在指定范围你查找键值 ,然后付给v2 ,默认scope="page"

    <c:set value="${header['host']}" var="v5"/>//从请求协议中取得键为host的值

    <c:set value="${param['id']}" var="v6"/>

    <c:set value="abc" target=${some} property="value">//为对象some,给对象属性value赋值为"123"

    <c:set target="${map}" property="3"/>//为容器设置键值

    <c:remove var="some_key" scope="page"/>//删除指定键对应的值

    <c:if test="${d1+d2==d3}"> <c:out value="${${d1}+${d2}+${d3}}"/></c:if>

    <c:if test="${sessionScope.user != null}"> <c:out value="${sessionScope.user}"/></c:if>

    <c:catch var="ex"><c:choose> <c:when test="${param['id'] mod == 0}"></c:choose></c:catch>//如果遇到异常,将异常保存到ex中

    <c:forEach var="v1" items="${c1}">//定义变量v1,对c1进行iterator <c:out vaue="${v1}" escapeXml="false"/></c:forEach>

    <c:forEach var="v2" items="${c2}" varStatus="status">//varStatus="status" 表示容器下

    标 <c:out vaue="${status.index}" escapeXml="false"/> //</c:forEach>

    <c:forEach var="v3" items="${c3}" begin="1" end="10" step="2">// <c:if test="${!status.lase}">//判断是否是最后一个 <c:out value=","/></c:forEach>

    (38)<c:forEach var ="v5" begin="1" end="9"> <c:out value="${v5}" escapeXml="false"/></c:forEach>

    <c:forTokens delimes=",;" items="${s1}" var="v7">//用,:来分割 <c:out value="${v7}"/ escapeXml="false"></c:forTokens>

    <c:import var="u1" url="link/poem.htm" charEncoding="GBK"> <c:out value="${u1}" escapeXml="false"/></c:import>

    <c:import var="u2" url="link/t1.jsp"> <c:param name="id" value="123"/></c:import>

    <c:url var="u3" value="link/t2.jsp"> <c:param name="a1" value="1"></c:if test="">

    <c:url> </c:url>(39)String t = "sun,im,;oracle;bean";StringTokenizer st = new StringTokenizer(t,",;");

    (40)正则表达式import java.util.regex.*;public static void main(String[] args){ String target = "java*****88j2ee****java***java123ajava";  Pattern p = Pattern.compile("java"); Matcher m = p.matcher(target); boolean b = m.matchers();//false while(m.find()){  System.out.print(m.start()+","+m.end());  System.out.println(target.substring(m.start(),m.end())); }}

     //替换 StringBuffer buffer = new StringBuffer(); while(m.find()){  m.appendReplacement(buffer,"j2ee"); } m.appendTail(buffer);//把尾部加上 String t1 = buffer.toString(); System.out.println(t1); (41)String target ="a1*****b2*****c3**";Pattern p = Pattern.compile("[abc][0-9]");//abc中的任何一个,0到9中的任何一个

    (42)struts:

    M -》业务流程,数据访问。V -》显示逻辑C -》控制逻辑(对流程起到控制作用,起到连接M C层)

       C V -|- M

    开元:(学习原则)1,做了什么?2,如何扩展?

    (43)用jubilder创建个struts后,自动修改web.xml。同时在/WEB-INF下加入标签库。在lib下加入

    .jar文 件。struts-config.xml是对web.xml的一个补充。(44)新建struts如何修改web.xml:

    <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param>  <param-name>config</param-name>    <param-value>/WEB-INF/struts-confg.xml</param-value> </init-param> ... ...</servlet><servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>.do</url-pattern></servlet-mapping>ActionServlet是中央控制器,所有请求都先通过它,然后再转发到其他的地方。它是通过读 struts-confg.xml,来决定转向哪个Servlet的。

    (45)Action 实质也是个ServletActionServlet 是中央控制器Form 是个bean ,用来保存数据,ActionServlet根据页面请求,调用from做成个对象,传给

    action.

    (46)Action path: url路径。FormBean name:封装的beanScope: 参数提交范围Validate FormBean:提交之前是否验证。

    execute相当与servlet里的service方法。

    同时修改了struts-config.xml文件。<action-mapping> <action name="loginForm" path="/login" scope="request"  type="test.struts.action.LoginAction" validate="false"> <forward name="success" path="/success.jsp"/> <forward name="error" path="/error.jsp"/> </action></action-mapping>

    (47)创建form,修改struts-config.xml文件<struts-config> <form-beans>  <form-bean name="loginFrom" type="test.struts.form.LoginFrom"/> </form-beans></struts-config>

    (48)jsp中的提交<form name="loginFrom" action="login.do" method="post"></form>

    (49)Action中的execute方法,包含以下参数:ActionMapping: 配置对象,一个(ActionMapping)相当于配置文件(struts-config.xml)中的一

    个 action。ActionFrom: 传过来的fromHttpServletRequest: request请求HttpServletResponse: response响应

    方法返回值:ActionForwardActionFroward dd = mapping.findForward("success");return dd;

    jsp -(login.do)->ActionServlet(struts-config.xml)->LoginAction,LoginFrom然后ActionServlet调用LoginAction的execute方法。(50)form验证的功能:

    中的get,set方法什么时候调用?答:实例化form ->调用set,get->validate->实例化Action

     

    ActionErrors validate(ActionMapping actionMapping,HttpServletRequest

    httpServletRequest){ ActionErrors errors = new ActionErrors(); //<html:errors/> errors.add("id.null",new ActionError("id is null!!!"));}ActionErrors:封装错误信息。

    在页面中写上:<html:errors> //全部显示//struts自定义标签分开显示:<html:error property="id"/>

    (51)struts标签库:<%@ taglib uri="/WB-INF/struts-html.tld" prefix="html"%> //<html:errors>资源文件ApplicationResources.propertiesabc=ABC.. ..修改配置文件struts-config.xml

    <message-resources parameter="resources.ApplicationResources"/>

    一般存放到classes下。

    根据浏览器的请求判断调用的资源包(52)<%@ taglib uri="/WB-INF/struts-bean.tld" prefix="bean"%><bean:message key="abc"><bean:message key="page.login.title"/>  //键值配置文件中定义<bean:message key="page.login.from.id"/> //键值配置文件中定义<bean:message key="page.login.form.password"/> //键值配置文件中定义

    (53)配置资源文件可以有两种方法:1,在web.xml中设置2,在struts-config.xml中设置(54)java中的泛型ArrayList<String> list = new ArrayList<String>();list.add("a");list.add("b");list.add("c");for(String s : lis){ System.out.println(s.toUpperCase());}(55)<%@page pageEncoding="UTF-8"%>国际化标准struts中所有的资源文件都要有固定的标准native2ascii -encoding gb2312 a.properties b.properties

    资源文件命名XX_zn_CN

    提交时出现乱码,解决方法是写一个过滤器,实现 request.setCharacterEncodeing("UTF-8");这样整个项目都统一为'UTF-8'了。1,页面中2,过滤器3,资源文件(56)

    页面最前面:<%@ page pageEncoding="UTF-8"%> 显示和提交都是UTF-8格式服务器端一般默认是以IOS8859方式取数据的。而我们存数据时是以UTF-8形式存的。request.setCharacterEncoding("UTF-8");request.getParameter("value");

    给浏览器看的:<%@ page contentType="text/html; charset=UTF-8" %>

    (57)<%@ page pageEncoding="UTF-8"%> <%@ page contentType="text/html; charset=UTF-8" %>

    (58)在配置文件(struts-config.xml)中写上<action forward="/regist.jsp" path="/regist" />

    (59)将功能类似的Action和并到一个里面。新增和查看继承:org.appachers.struts.actions.DispatchAction

    <a href="operation.do?op=operationA"/> _fcksavedurl=""operation.do?op=operationA"/>" //operationA在Action中需要有相同方法<a href="operation.do?op=operationB"/> //operationBpublic ActionForward operationA(ActionMapping mapping,ActionForm actionForm,...){

    }

    struts-config.xml中修改<action input="/dispatch.jsp" path="" parameter="op" type=""></action>(60)

    反射机制Class c = this.getClass();Method method = c.getMethod(name,new Class[]{String.class});//getMethod获取name方法的信息,参数:Class类型数组method.invoke(this,new Object[]{arg});//执行方法

    (61)struts中的标签在配置文件(struts-config.xml)中page.lookupDispath.form.submitA=Apage.lookupDispath.form.submitB=B

    页面:<html:submit property="op"> <bean:message key="page.lookupDispath.form.submitA"/></html:submit>

    (62)form中的reset方法调用原理:当一个from对应多个action时,调用reset方法起作用。先调用下reset方法,然后调用validate方法。

    Action是多线程的,要注意同步操作。

    页面提交请求,系统调用ServletAction,检测scope范围内是否有from对象,要是没有新建一个

    from 对象放入session中。若已经存在,则调用reset方法,然后调用validate方法。然后对from进行 set,get方法,调用action操作。

    (63)Action<-DispathAction<-LookupDispatchActionDispathAction:<Action ... parameter="XX"/>LookupDispatchAction:需要实现getKeyMethodMap方法(64)扩展struts。关键在于对配置的操作。(65)struts标签<html/> -- <html:html/><form action="regist.do"/>       -- <html:form action="/regist"/><input name=""/> -- <html:test property=""/><submit name="" value="value"/>        -- <html:submit property=""><bean:message key="submit"><html:submit/>

    (66)解决重复提交问题。在提交出写个隐藏表单。提交是,将这个值写入session.saveToken(request);//将一个值写到request中,同时session中isTokenValid(request);//用来检查提交上来的值与session中的是否相同resetToken(request);//清空这个值

    saveToken(request):提交信息,这个方法只动生成个id值,放到session里,然后将这个值转

    发到 jsp里。这个jsp页面如果有<html:from>表单,则生成一个隐藏表单。if(isTokenValid(request)){ .... System.out.println(); resetToken(request)}else{ Systme.out.pritnln("重复提交");}/login.jsp -> saveTOken(request), 放到session对象里面  将信息写到regist.jspregist.jsp一定要用<html:form>regist.jsp -> ifTokenValid(request) 

    (67)<html:link forward="/regist"><html:link/>必须联接到全局<global-forwards> <form name="regist" path="/regist.jsp"></global-forwards>

    另一种方法<global-forwards> <form name="regist" path="/saveTokenForRegist.do"></global-forwards><action path="/saveTokenForRegist" type=""> <forward name="regist" path="/regist.jsp"></forward></action>

    (68)动态 form直接用DynaActionForm或继承DynaActionForm<form-bean name="dynaRegistForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="id" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> <form-property name="name" type="java.lang.String"/></form-bean>(69)多个页面对应一个form这个from会自动存到request或session里面

    (70)分次提交<html:form action="/XX"/><html action="XX.do"/>form :里面的reset()方法不处理配置文件struts-config.xmlscope="session"parameter="action"继承LookupDispatchAction实现getKeyMethodMap()方法

    (71)在action中验证ActionErrors errors = new ActionErrors();ActionError message = new ActionError("key");errors.add("duplicatie_id",message);saveERRORS(request,errors);return mapping.findForward("validate");

    (72)struts中的plug ins让程序一开始加载是就做某事。需要实现org.apache.struts.action.Plugln接口实现destroy(),init()方法。

    通过以下方法,可以做各种事情:)init(ActionServlet servlet,ModuleConfig config)ActionServlet:中央控制程序ModuleConfig: 对应struts-config.xml所有信息ActionMapping:对应struts-config.xml里的actionActionForward:对应struts-config.xml里的forward

    //Colliction type = m.getAllBookType();ServletContext application = servlet.getServletContext();application.setAttribute("book_types",type);

    (72)<logic:iterate id="bookType" name="book_type" scopte="application"> <bean:write name="bookType" property="id"/> <bean:write name="bookType" property="desc"/></logic:iterate>Collections.sort(List);//按定好的方法排序Collections.sort(List,Comparator);//临时指定排序逻辑

    接口:Comparable:实现该类,并复写compared();Comparator:int compare(Object,Object);

    class BookNameComparator implements COmparator{ public int compare(Object o1,Object o2){  BookType b1 = (BookType)b1;  BookType b2 = (BookType)b2;  return b1.getName().compareTo(b2.getName); }}

    (73)static 内部类 :是为这个类本身服务的。class BookType implements Comparable{ public static finally Comparator BY_NAME =  new NameCoparator(); private static class NameCoparator implementor{ public int compare(Object o1,Object o2){  BookType b1 = (BookType)b1;  BookType b2 = (BookType)b2;  return b1.getName().compareTo(b2.getName); }   }}

    Collections.sort(list,new COmparator(){ public int compare(Obejct o1,Object 2){  BookType b1 = (BookType)o1;  BookType b2 = (BookType)o2;  return b1.getName().compared(b2); }});

    (74)resulSet 在执行sql语句时,(select * from emp)是,不是一下全取出数据,而是一次取部分

    ( oracle默认是10),在执行next()时在取。所以不能断开连接。

    有时侯将resultSet付给容器,其目的是为了减少再次编译时间,并不是将结果保存到容易中。

    (75)Statement中有个getFetchSize()方法,返回一次取多少条记录。高手用。(76)jdk1.5新加功能 rt.jar jdbc:有个RowSet,也是用来访问数据库的,Class.forName("oracle.jdbc.OracleDriver");Object obj = Class.forName("com.sun.rowset.CacheRowSetImpl");.newInstance();//反射机

    智创 造对象RowSet rs = (RowSet)obj;rs.setUrl("");rs.setUsername("");rs.setPassword("");rs.setCommand("");rs.execute();while(rs.netxt()){ System.out.println(rs.getString(1));}rs.close();(77)struts中的标签html:显示用bean:用来取page,request,session,application中的数据logic:逻辑用(78)1 ,web.xml中声明2 ,<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>3 ,lib加入实现类定义一个标签共需要以上三个步骤

    (79)<html:html/><html:link href="www.163.com"> //跟写<a />一样功能 href</html:link><html:link forward="login">//forward需要在struts-config.xml中全局中定义, </html:link><html:link page="/htmlLink.do" paramId="id" paramName="123" paramProperty="a">//可以链接到action和页面 action需要在struts-config.xml中定义//paramId相当于key //paramName相当于value//没有paramProperty="",显示结果是 "id="123" "//有paramProperty="a",则结果是" id="123".getA() " page(/htmlLink.do 或者/login.jsp)</html:link>

    是否有".do",关键在于需要调用servlet在struts中"/"表示本应用的相对路径在struts标签中看到Name说明是个bean(80)struts中的文件上传标签<html:form action="HtmlFile.do" enctype="multipart/form-data"> <html:file property="file"/><br/><br/> <html:submit>submit</html:submit></hmtl:form>定义一个form,import org.apache.struts.upload.FormFile;

    在action 中的动作:HtmlFileForm f = (HtmlFileForm)actionFrom;FormFile file = f.getFile();String filePath = this.servlet.getServletContext().getRealPath("/uploads");

    //servlet是中 央控制器FileOutputStream fos = new FileOutputSteam(filePath+"/"+file.getFileName());BufferedOutputSteam bos = new BufferedOutputSteam(fos);InputStream is = file.getInputSteam();BufferedInputSteam fis = new BufferedInputSteam(is);

    int b = -1;while(b=fis.read()!= -1){ bos.write(b);} bos.flush();//同时将缓存中的数据写到本地。//close()也会调用这个方法的(81)<html:form action="/HtmlForm"> //HtmlForm不用写.do,如果用html调用时需要写.do <html:text property="name"/>//property相当于html中的name <html:submit property="submit"/> <html:hidden property=""/> <html:optionsCollection name="book_types" label="desc" value="id"/> //name是四个中的一个值</html:form>

    <bean:define id="v1" value="vean-v1" scope="request"/><bean:define id="v1" name="" property=""/>

    //定义一个变量//id:变量的名字//scope:变量范围//value:变量的值//name:与四种存值方式相对应//property:get,set方法对应

    <>(82)${stu1.name} //struts中jsp2.0 表达式可以直接使用(83)<% Student student = new Student(); student.setName("xml"); pageContext.setAttribute("stu",student);%><logic:equal value="xml" name="stu" property> ok</logic:qual>//一般来说是比较字符串,如果两个多是数字则,按数字来比较

    (84) Map map = new HashMap(); map.put("one",new Integer(1); map.put("two",new Integer(2); Set set = map.entrySet(); Iterator it = set.iterator(); while(it.hasNext()){ Map.Entry entry = (Map.Entry)it.next(); entry.getKey();entry.getValue(); //Map.Entry内部类}

    (85)分步式: EJB,JMS,SOCKET,WEBSERVICE都可以实现的。JMS (JAVA MESSAGE SERVICE)Destination:消息容器(用来存放消息的容器)  包括:队列(Queue):点对点传送消息 和主题(Topiz):Connection:消息连接ConnectionFactory:消息连接工厂JNDI:把资源和组建绑定。 

    (86)import javax.jmx.*;import javax.naming.*;

    QueueConnectionFactory qcf;QueueConnection qc;QueueSession session;QueueSender sender;TextMessage message;Queue q;

    Hashtable env = new Hashtable();env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");//

    用 WLInitialContextFactory做一个工厂env.put(Context.PROVIDEX_URL,"t3://localhost:7001");//weblgic协议

    Context ctx = new InitialContxt(env);//用上面的信息做一个Contextqcf = (QueueConnectionFactory)ctx.lookup("CF"); //查找JNDI "CF"已经在webligic中定义

    好了q = (Queue)ctx.lookup("queue");//查找JNDIctx.close();

    qc = qcf.createQueueConnection();session = qc.createQueueSession(false,Session.Auto_ACKNOWLEDGE);//自动应答sender = session.createSender(q);message = session.createTextMessage();//

    (87)

    EJB:1 是服务器段组件2 分布式组件(远程调用)3 容器提供服务支持(88)session分为有状态和无状态bean. 一般应用中用无状态的会话bean.因为一般在用session和request中就可以保存状态,

    用ejb 来保存状态,对性能要求太高。

    session分为stateful和stateless.

    (89)实体bean:完成数据的持久化。不使用ejb有几个原因。1 性能。2 过于复杂。

    EJB设计是为了使操作简单,而事实却相反。性能:对数据库访问本身就是性能的要害。复杂:过于复杂,重量级。

    bmp:由自己来管理持久化。cmp:由容器来管理持久化。(90)项目性能的,首先在于数据库的设计,其次是o/mp,而代码级是最小的。(91)通过EJBObject 对Entity Bean操作。(92)面试准备: 笔试就是基本工。(编程习惯)lang,io,util,thread,jsp(标签),servlet,jstl(标签 ),struts(标签)。 面试:(编故事)。说了就一定得会。心得体会。  java设计模式。1 原理,类图。2 那些api用了这些模式。3 自己实际在项目

    中用的 模式(为什么做)。  (uml)(93)在session bean中访问entity bean,需要在session bean中实现。

    CustomerHome ch;pulbic void ejbCreate() throws CreateException{ Context ctx = new InitialContext();// ch = (CutomerHome)ctx.look("customer");//weblogic-ejb-jar.xml中查找 //session bean访问entity bean是本地接口,不需要造型 } (94)EJB QL:Cutstorm ,Order,Item,Book

    select i.orger.Cutomer.name form Item i where i.date =?1

    select object(o) form Order o,Customer c //声明

    select o.id form Customer c,IN(c.orders) o where c.name=?1 and o.createTime=?2

    select i.date from Cutorm c,IN(c.orders) o,IN(o.items) i where c.id=?1 and

    i.book.name  =?2

    (95)合成模式:(与装饰模式相识,合成是可以包含多个父类,复写父类的方法) 应用:文件搜索观察者模式: java.util.Observer;//观察者 java.util.Observable;//被观察者

     class Hero extends Observale{  private int x,y;  public void move(int dx,int dy){  x += dx;y += dy;  this.setChanged();//状态改变  this.notifyObservers();//通知  }  pulbic String getXY(){   //  }     } class WeaponA extends Weapon{  WeaponA(Observale o){super(o);}  public void update(Observale o,Object arg){//o被观察者,args  Hero hero = (Hero)o;  System.ou... } } class WeaponB extends Weapon{  WeaponB(Observale o){super(o);}  public void update(Observale o,Object arg){  Hero hero = (Hero)o;  System.ou...  } } abstratct class Weapon implements Observer{ Weapon(Observale o){  o.addObserver(this);  } }

    (96)EJB QL  finder and seletor  访问BEAN的对象 除了findByPrimaryKey所有的(finder and seletor )方法都要在ejb-jar.xml中定义

    。用 <ejb-ql>。 Finders:在home 和local home中定义。返回的是EJB OBJECT对象。不能返回related

    date。 在ejb-jar.xml 的<ejb-ql></ejb-ql>之间。 Selectors:可以返回Bean Object ,可以返回字段。需要在实体bean中定义(不象

    finder在 home接口中定义),需要在ejb-jar.xml中描述。 命名:finder<method> 和ejbSelect<method> finder可以暴露给客户。select由内部使用,客户无法调用。 返回:finder:返回写在的实体的对象。select:可以返回任何对象(在一个包中)或

    容器或 CMP fields。 finder:select object(o)... (97) 在jbuilder中建立实体关系。 Clear默认关系,建立关系。 删除实体中与(建立关系新生成)字段重复字段。 将有用字段加入到ejbCreate(...)方法中(98) 在session中返回用户的消费。 ch.findByPrimaryKey(customerID){ Customer c; c.getOrders(); Collection orders = getIterm(); //..} //需要多次访问实体。 //解决方法是在Customer中使用select方法。  select i.price from Customer c IN(c.orders) o IN(o.items) i 在BEAN中有ejbSelectTotalitemPrice 在ejb-jar.xml 有select i.price from Customer c IN(c.orders) o IN(o.items) i 在Customer中定义selectTotalitemPrice()方法。 需要在BEAN中实现selectTotalitemPrice()方法。 public double getTotalprice(){  COllection prices = ejbSelectTOtalItmePrimece(getId());  Iterator it = prices.iteratoro();  double sum = 0.0;  while(){   //...  } }(99) 在Session Bean中实现查找与通过在实体BEAN中用select方法。应该后者效率更高些。

    因为 用Session Bean 需要多次访问。(100)  每个实体bean都有一个EntityContext. (Customer)entityContext.getEJBLocalObject().// 通过entityContext可以获得和这个实体Bean相关的方法。(101) j2ee核心设计模式。 Delegate模式是为了封装远程调用的复杂性。 JMSService和EJBService都是分布式。 Delegate模式只在分布式情况下使用。 Delegate需要调用ServiceLocator(singleton),ServiceLocator在lookup  BushinessService.(102) EJB使用stu,ske..协议。 WebService使用XML的SOAP协议。

    (103) UML图中,序列图中返回一般不画。除非特殊情况除外。默认调用就返回。(104) //客户端访问EJB //将与weblogic有关的信息放入hastable中 Properties pro = new Properties();       

    pro.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");        pro.put(Context.PROVIDER_URL,url);//url = "t1://localhost:7001" //通过hastable信息初始化context        Context context = new InitialContext(pro); //在树上查找对象        Object ref = context.lookup("jndi");//"jndi"是在ejb-jar.xml指定上树的 //构造远程home对象        home = (SessionHome)protableRemoteObject.narrow(ref,...class); //调用方法 home.findByPrimaryKey(id){ ... }(105) hibernate 访问DB是从session开始的。 <session-factory>  //有关hibernate连接数据库配置信息 <mapping resource="test/hibernate/Book.hbm.xml"/> //可以这里写,也可以动态加

    载 </session-factory>(106) 1 将hibernate导入类包 2 写hibernate.cfg.xml配置文件(107) <hibernate-mapping package="test.hibernate'>  <class name="Book" table="BOOKS">    //必须有id项   <id name="id" column="ID" type="java.lang.String">    <generator class="assigned"/>   </id>   <property name="name" cloumn="NAME" type="java.lang.String"  not-null="true">   </property>  </class> </hibernate-mapping>(108) //用hibernate自带包调试 Configuration config = new Configuration(); config.configure("/hibernate.cfg.xml");//加载配置文件 SessionFactory sessionFactory = config.buildSessionFactory();//创建工厂 Session session = sessionFactory.openSession();//打开工厂

     Transaction tx = session.beginTransaction();//开启一个事务 Book book = new Book(); book.setId("10000"); book.setName("hibernate"); book.setPrice(new Double(60.00)); book.set...

     session.save(book); tx.commit(); session.close();(109) 1 hibernate简单,具有缓存技术 2 把对数据库的实现完全用hibernate 来实现,优化做的特别好(110) hibernate 中的session尽量重用。session 对于一个线呈是唯一的。 hibernate中的sessionFactory是基本的类,功能已经很强大了。但我们要对它进一步

    实现, 用组合实现。 public class TestSessionFactory{ private static SessionFactroy factory = null; private static Configureation config = new Configuration(); private static ThreadLocal t1 = new ThradLocal();  public static Session getSession() throws Exception{  Object obj = t1.get();  if(obj==null){   if(factory==null){    config.configure("/hibernate.cfg.xml");    factory = config.buildSessionFactory();   }    Session session = gactroy.openSession();    t1.set(session);    return session;  }else{    return (Session)obj;  } } public static void closeSession(){  Ojbect obj = t1.get();  if(obj!= null){   Session session = (Session)obj;   session.close();  }else{   session.close();  } } }(111)设计模式创建模式:用来构造对象的模式。java中2种创建对象方式,new和动态(java反射机制)。1. 简单工厂模式(simpleFactory):产品类(接口或抽象类)和具体产品。具体产品继承

    于产品。工厂类(create)产品类(抽象类)。这里面有3个角色。什么时候用?需要把具体类

    封装起来时,在不同的场合创建不同的对象,这些对象有共同的接口。把这种逻辑封装到工厂里

    面。有时会有变形,工厂类会和产品类和2为一,抽象类有个静态方法,返回他的事例。例如:日

    历(Clea..)类和DateFormate类。这两个类中会有创建类。返回本身的创建。 还有可能3个角

    色和3为1,这就是单例模式。 Jdk1.5中的枚举就是多例模式。我什么时候用?比如连接数据库

    的时候,可能连接不同的数据库(mysql,oracle),我就用到了工厂模式。还有平时中做项目时

    ,有几种实现,可以有ejb和javabean,我就用到了简单工厂模式。(合适的情况下,用合适的

    对象)2. 工厂方法模式:实际中的应用,jdk中的collection. 什么时候用?简单工厂是为了创

    建产品。当两个父发生关系,当不同的条件生成不同的对象时,具体实现有子类来实现,就时用

    这个模式。(家族的成员为另一个家族服务,比如:家族是枪和子弹,具体的枪和具体的子弹是

    家族成员,枪的不同,决定了子弹的不同)。应该说明白了。3. 抽象工厂方法模式:DTO模式就是用的典型的抽象工厂方法模式。有个抽象工厂类(

    AbstratFactory),Product1类,Product2类。为什么用这个模式,把数据库表的访问封装。对

    不同的表需要提供不同的DAO。为oracle和 mysql个写个实现类。DAOFactory factory = DAOFactory.getInstance(“oracle”); CustormDTO dao = factory.getCustomDTO();Dao.save(“”);只要改变字符串就可以了。比较简单时就举jdk的例子,复杂点的就举实际的应用。开闭原则(向变化是开发的,向修改是

    封闭的)。我反编译JDK1.5中的enun用了多例。哈哈。。。结构模式:用来描述类间的关系。1. 装饰模式:具体的类,和装饰器。Component(抽象类),里面有个方法(比如read)

    ,具体有两个子类,这两个子类中也有这个方法(read)。实现:jdk中文件流。应用:IO的输入

    输出。什么时候用?在做SWING中,主题有不同的颜色,字体和风格,用户可以来回切换,就是

    用装饰模式来实现的。在一个主见中灵活的安装,切换时应用。2. 合成模式:合成模式与装饰类图几乎相同,就是改为1 …n。装饰是1..1。就两种,叶

    子和树枝。Junit中应用了合成模式。3. 适配器模式:在代码重构是应用。比如过去的JDK中用vector ,和hashtable用的多,但

    现在主要用arraylist, hashset等,而过去的却不能丢弃,这个时候用的比较多。使得对象既使

    原来的方法可以应用,又有了新的功能。JDK中的Enemeration和Iterator.4. 不变模式:String 就是典型的不模式。他的成员是finel类型,外面不能改变,不能

    return。这个模式中大量的应用了clone(). 不变模式是线程安全的。hashCode不用改变,(

    hashCode是根据成员变量算的)。为什么StringBuffer的equal不重写?因为他的变量是改变的

    ,所以写不写没有多大意义。像常量经常变的类,就无需实现hashCode.我们的应用:写了一个

    复数类。一般说来实现了equal方法的,一般都是不变模式。Date中的get,set方法不推荐使用,

    就是因为他实现了不变模式。Date中的setTime,getTime是供日期转换调用的,要想获得日期不

    要用他们,用Clander类获得。

    Public class Complex{//不应该有set方法,有set的方法就可以改变值了。Private double a;Private double b;toString();equal();hashCode();compabled();//如果实现compablable}(112)XML:<book> <bookName>java</bookName> <bookPrice>100.00</bookPrice></book>

    xml文档和对象的映射hibernate:数据库表和对象的映射.Castor:从xml 文档中读数据,变成对象。(113)Session session = SessionFactory.getCurrentSession();Transaction tx = null;

    Customer customer = (Customer)session.load(Customer.class,customerID);//通过类明和类

    型,查找xml文档List list = session.find("select c  from Customer as c order by c.name

    desc");//Customer是类明session.delete(cusomer);//删除持久化

    (114)Customer c = home.findByPrimaryKey("id");c.setName("name");//会马上改变数据库(115)HIBERNATE:public class Customer implements Serializable{//需要实现Serializable接口 //定义变量 //get,set方法 }映射文件<hibernate-mapping package=""> <calss name="Customer" table="CUSTOMERS"> <id name="id" column="ID" type="string">//column与set方法名相同  <generator class="assigned"/> </id> <properator name="name" column="NAME" type="string"/>

     <set name="orders">//字段名   <key column="CID"></key>//column:关联的字段,   <one-to-many class="test.hibernate.Order">//class:用来指定关联的对象   </one-to-many> </set>

     </calss>

    </hibernate-mapping>

    hibernate是在配置文件中做关联(116)在类中实现collection con = null;set,get..<many-to-one name="customer" class="test.hibernate.Customer"> //</many-to-one>(117)Order order = (Order)session.load(Order.calss,new Integer(105));Customer c = order.getCustomer();Syset...

    对对象操作,必须转为持久化对象(118)Caster:开元组件,解析xml文件,做成对象。<?xml version="1.0"><item> <name></name> <descript></descript> <price></price> <quantity></quantity></item>import org.exolab.castor.mapping.Mapping;

    import org.exolab.castor.xml.Marshaller;//分组import org.exolab.castor.xml.Unmarshaller;//解组

    public class Item{ private String name; private String descritp; private double price; private int quantity;

     public String get.. public void set..}

    Unmarshall//把xml变成对象。Marshall//把对象变成xml文件。

    //将xml做成对象FileReader fr = new FileReader("c://temp//item.xml");Item item = Unmarshaller.unmarshal(Item.class,fr);

    //将对象作成xml文件Item item = new Item();item.set..();..Marshaller.marsha(item,new FileWriter("c://temp//iteml.xml"));//默认时,把数字型存成属性,字符型存成成员。

    如果存在嵌套,需要新定义文件。mapping.xml<?xml version="1.0"?><mapping> <class name="tst.xml.castor.Item"> <field name="name" type="string"/> <field name="desc" type="string">  //  <bind-xml name="description"/> </field> </class></mapping>

    1 载入包 import org.exolab.castor.mapping.Mapping;2 Mapping mapping = new Mapping();  mapping.loadMapping("mapping.xml");  Unmarshaller unmarshaller = new Unmarshaller(Item.class);  unmarshaller.setMapping(mapping);

      FileReader fr = new FileReader("c://temp//item.xml");//  Item item = unmarshaller.unmarshal(Item.class,fr);  Item item = unmarshaller.unmarshal(fr);  System.out.println(item.getName());

    ///

    mapping.xml<?xml version="1.0"?><mapping>

     <class name="tst.xml.castor.Item">

     <field name="name" node="attribute" type="string" > //node:表示是元素               <bind-xml node = "attribute/">        </field>

     <field name="desc" type="string">  //  <bind-xml name="description"/> </field> </class></mapping>

    <web-app>与属性webApp相对应。Schema是用来定义标准的,用来约束xml文档。用来规定另外一个xml,那些元属该写,那些不该

    写。有两种dtd和Shchema。

    通过shchema生成。<?xml version="1.0" standalone="yes"?><order> <item/> <item/> <item/></order>

    public class Order{ private Vector item; get,set..}<?xml version="1.0"?><mapping> <class name="test.xml.caltor.Order">  <field name="items" type="test.xml.castor.Item"  

    collection="Item"> </class> <class name="test.xml.caltor.Item">   //... </class></mapping>

    今天学习解析有xml共有三种1: Unmarshaller.unmarshaller(Class,Reader);  //所有的元属与类的属性必须相同。2: 应用一个配置文件。 Mapping.loadMapping(...); unmarshaller.setMapping(mapping); //需要会写mapping文档3: (119)driver:com.mysql.jdbc.Driver;url:jdbc:mysql://localhost:3306/sampledb(120) import org.exolab.castor.xml.*;//导入命名空间(121)多线程,IO,Collection(122)重载和重写的区别。一个是前期绑定一个是后期绑定。(123)静态方法或变量class A{static int a = 1;static void f(){}}class B extends A{static int a = 2;static void f(){}}public static void main(){A a = new B();a.a// A的aa.f();//A的f()}静态的是类的东西,与对象没关系如果变量不是静态的(int a),成员变量不叫重写,叫隐藏。

    访问控制public,fridendly 类前面。public,fridendly,protected,private方法前面。什么时候加protected?一个抽象类,需要子类来扩充,需要用protected

    接口和抽象类(interface,abstract)接口可以继承接口。抽象类不能被示例化。只能被继承。能用接口就不用抽象类。子类公共的部分提取出来,要用抽象类。继承是怎么想出来的? 方法的实现,就用抽象类。什么时候用抽象类?用继承的同时用重用(代码重用)。什么时候用接口?用继承不必用重用。

    接口的回调。comparable类的comparaTo方法。事例:class StudentList{private ArrayList students;public void addStudent(Student student){this.students.add(students);}

    public void print(StudnetFilter filter){Interator it = filter.iterator();while(it.hasNext()){Student student = (Student)it.next();if(filter.match(s)){ System.out.pirntln(s);}}}}interface StudentFilter{pubicvoolean match(Student student);}

    (124)属性和成员变量。一般相同。严格的讲是说:带有get,set方法的叫属性。对象和变量。对象放到堆中。栈中放的是变量。(125)Integer i = new Integer(1000);//左边 声明变量i,类型是Integer//右边 在内存创建一个对象,初始值是1000//将地址复给i。(126)内部类的种类:public class Test1{ private class T{//这个类是为外边的对象服务的  int i; }}对象和类之间的关系:对象的属性值不一样。

    静态内部类:这个类是为外边的类服务的。可以用pulbic来调用。什么使用?这个静态内部类跟普通类一样。因为它的功能单一,就为这个类服务的。

    局部匿名内部类:只与方法有关系。

    什么时候用他们??1,普通内部类。 一个类运行,有个线程来跑2,实现单一的功能。 就相当与一个方法。

    (127)两个字符串一样hashCode一定一样,两个字符串不一样hashCode不一定不一样。Object的hashCOde默认是地址值。subString(,);//前包后不包StringTokenizeng()//类string的正则表达式.XXvalue();抛出NumberformatException异常。日期:Calendar ,Date,Long  GregorianClendar//阳历 .getInstance();//按默认 .getInstance(Locale lLocale); .get(int field);//获取字段值 DAY_OF_WEEK_IN_MONTH//(128) DateFormat,SimpledateFormat//按照指定的格式对日期格式化(129) 开闭原则。 把变与不变分开来。面向接口设计。 为什么要用继承:适应与面向对象的基本途径。符合开闭原则。 (130)XML:表示数据的规范。java和xml是绝配。xml是数据无关。java与其他语言传递数据,可以通过xml来传递。

    1,设计出合理的xml表达数据,并且用schema2,用java解析xml文件.

    (131)XML语法:基本语法DTO,schema:对xml进行规范的。解析xml:SAX,DOM显示xml:xsl(132)XML语法:基本语法XML与HTML,HTML复杂,XML简单。XML:标签成对出现,可以加内容,可以加子标签。 <book id="123"/>

    <class-info id="123"> <teacher>  <name>...</name>  <>...</> </teacher> <student id="1">  <name>...</name> </student></class-info>写的好就形成一个公用标准。DTD,SCHEMA来描述标准。SCHEMA也是一个XML文档。是一个已经规范了的。W3C组织。

    解析xml:SAX,DOMSAX是读一点对开始解析。效率高,编程复杂。DOM是一下全读到内存中,效率底,编程简单。数据绑定集合两者,具有跟好的功能。

    显示xml:xslxml就表示数据。(133)HTTP(HyperText Transfer Protocol)XML(extensible Markup Language)(134)<?xml version="1.0'encoding="GB2312" standalone="no"?>//可以有很多//encoding以什么编码//standalone是否独立<?xml-stylesheet type="text/"?>//显示样式

    <><>区分大小写必须有根元素& ->&> ->>< -> <" ->'<![CDATE[文本内容]]>(135)DTD:文档类型定义。<!OCTYPE 书籍列表[ <!ELEMENT 书籍列表(计算机书籍)*> <!ELEMENT 计算机书籍(书名,价格,简要介绍)> <!ELEMENT 书名(#PCDATA)> <!ELEMENT 价格(#PCDATA)> <!ELEMENT 简要介绍(#PCDATA)>]>

    可以直接写到文件前面,也可以写到另一个文件中,引用进来。(136)<!OCTYPE petris[ <!ELEMENT petris(petri)*>

     <!ELEMENT petri(圆|方)*> <!ELEMENT 圆(点|线)*> <!ELEMENT 点(#PCDATA)> <!ELEMENT 线(#PCDATA)> <!ELEMENT 方(线*)> <!ELEMENT 线(#PCDATA)>]>

    (137)public static final char sep='#';//final在编译时就将sep替换成'#',提高效率

    (138)ArrayStoreException:Object[] a = new String[2];a[0]="a";a[1]= new Integer(1);String[] b = (String[])a; //抛出异常(139)String[] ar = (String[])Array.newInstance(String.class,3);//用反射机智创建一个数组(140)定时类。TimerTask:抽象类Timer:

    方法schedulescheduleAtFixedRate

    随机函数Random属性Properties是hashTable的子类数值BigDecimal反射机智Class : classfoName("类的路径"); Class.class(); 对象.getClass();Method:  Array :

    (141)class A{public String f(Strings ,Integer i){ return "f"; }public String g(Strings ,Integer i){ return "g"; }}A a new A();String method = "f";Class c = Class.foName("....A");Ojbect  o = c.newInstance();Method m = c.getMethods(method,new Class[]{String.class,Integer.class});String str = m.invoke(obj,new Object[]{"abc",new Integer(1)});System.out.println(str);(142)<!DOCTYPE person[<!ELEMENT person(#PCDATA)>]><person>john</person>

    //cmd> smxml -d 1.xml  //检查xml并打印

    (143)把DTD放到另一个文件中<!DOCYTE person SYSTEM "2.dtd"><person>john</person>(144)<!DOCTYPE person[<!ELEMENT person(name,addr)><!ELEMENT name(#PCDATA)><!ELEMENT addr(#PCDATA)>]>

    <person>john</person>(145)<!DOCTYPE person[<!ELEMENT person ANY><!ELEMENT name ANY><!ELEMENT addr(#PCDATA)>]>

    <person><addr>ht</addr><name>John</name></person>(146)<!DOCTYPE person[<!ELEMENT person (name,addr,(tel|email))> //注意应该有空格的<!ELEMENT name (#PCDATA)><!ELEMENT addr (#PCDATA)><!ELEMENT tel (#PCDATA)><!ELEMENT email (#PCDATA)>]><person><name></name><addr></addr><tel/>//或</email></person>(147)#PCDATA  //文本内容(148)<!ELEMENT br EMPTY> //元素是空的,可以加属性(149)<!ENTITY email "iam@263.net"> //实体引用//在DTO中可以规定系统不带的实体引用email 代表"iam@263.net"

    <email>&email</email>(150)<!ENTITY context SYSTEM "13.txt"> //引用本地文件

    &context  //是13.txt的内容(151)<!ENTITY %name>(152)<!ENTITY % pc "(#PCDATA)">//%内部实体引用

    (153)<!ATTLIST book language CDATA "Englist">//属性列表<book language = "somelanguage"> //...</book>(154)<!ATTLIST book language CDATA #REQU> //必须指定<!ATTLIST book language CDATA #IMPLIED> //可有可无<!ATTLIST book language CDATA #FIXED> //定死的<!ATTLIST book language CDATA (Engilsh|France) "Englist"> //可选的定死的(155)<tel>123456</tel>DTD限制不够灵活,Schema:本身就是一个xml,功能强大。用来约束其他的xml。(156)Schema:一致性。与xml相同扩展性。可以自己增加规范性。比DTD更细。(157)<?xml version="1.0"?><xsd:schema> <xsd:element name="greeting" type="xsd:string"/>//xsd:string类型</xsd:schema>

    //xml文件内容<?xml version="1.0"?>//xml命名空间,是xml具有比较好的扩展性<greeting xmlns:xsi="http://www.w3.org/2001XMLSchema-instance"   xsi:noNamespaceSchemaLocation="hello.xsd">Hello,Wrold.</greeting>(158)<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="customer"><xsd:compleType><xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address" type="xsd:stirng"/></xsd:sequence></xsd:compleType>

    </xsd:element>

    </xsd:schema>(159)多线程的创建。Tread中的基本的方法。 默认一个线程.main() 一个线程对应一个栈空间。一个程序记数器。线程分为守护线程和非守护线程。区别:java虚拟机是一个程序。如果发现现在所有线程都是守护线程,就会退出。 setDaemon(boolean on)把守护线程变成非守护线程。 例如给学生出题,打印时间就可以做成一个守护线程。(160)jdk1.5:多了一个同步包。java.lang.annotation原来是开元东东,现在被吸纳到jdk1.5中。(161)1、servelt的生命周期?Servlet接口,HttpServlet类,后者实现前者。 init,service,destroy, init:事例初始化时调用。service:接到服务请求是调用,协议无关的,所有说servlet

    不只能做web程序。destroy:事例被销毁前调用。 HttpServlet:实现了servlet ,专门为http协议服务的。还具有其他方法。

    doGet,doPost。get,post是http协议的两种方法。HttpServlet的servlet根据请求的协议头是

    get,post方法,来调doGet,doPost方法。2、ServletContext:包含上下文信息。相当于一个工具箱。一个它对应一个webApplication。

    获取ServletContext属性。ServletContext ctx = getServletContext();ctx.setAttribute();//键值对ctx.getAttribute();//通过键获得ctx.getInitParameter();//ctx.getInitParameterNames();//得到初始化的名,返回值是所有键

    在web.xml文件中根:<context-param> //web应用所共有的参数。</context-param> ctx.getRealPath();//返回文件的真实路径

    RequestDiaptcher rd = ctx.getRequestDispatcher("a.jsp");//获取转发请求rd.forward(request,response);//转发请求

    ctx.getServerInfo();//servlet的基本信息

     

    ServletConfig针对一个servlet。ServletContext针对的是一个application的。<servlet> <init-param> //通过ServletConfig来获取 </init-param></servlet>(162)ServletConfig://比较简单ServletConfig config = getS3ervletConfig();config.getinitParameter(String);config.getServletName();(163)request,response:request.getAttribute();//获取属性request.getContextPath();//获取url的根目录request.getCookies();//获取cookrequest.getHeader(String);//获取http协议头里面的信息,协议以键值对方式存放request.getRequestURL();// /TestServlet/hellorequest.getRequestURI();// http://localhost:7001/TestServlet/hello(164)response:response.addCookie();//response.getWriter();//获取输出流response.encodeURL(String);//重写url.有的ie不支持cook,进行重写。(165)获取请求信息:request.getParameter();session控制:session每一个用户获取sessionId。如果客户端禁止cook,就要进行url重写。(166)数据共享:Servlet是单实例多线程。过滤:Filter 要求熟练写,和在 web.xml中配置监听:(167)JSP:基本标签。//要求特别熟练JSP怎么变Servlet?(168)内嵌对象:out,exception,application,request,response,session,pageContext(jsp专有的)。(169)编码处理:jsp的编码格式。rsponse.setContextType();与<%@ page contextType="text/html;charst="UTF-8" %>对应request.setCharacterEncoding("");//<%@ page pageEncoding="UTF-8"%>//告诉servlet转码是按照这个方式编译(170)标签库:自己会写简单的标签库(171)JSTL表达式:要求自己会写


    最新回复(0)