`
windy2coast
  • 浏览: 54215 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

笔记**************

    博客分类:
  • Java
阅读更多

环境变量C:\jdk1.5.0_04   JDK安装路径
JAVA_HOME   C:\jdk1.5.0_04

编辑系统变量
变量明:  Path
变量值: C:\jdk1.5.0_04\bin


在编译Servlet时,有时会出现找不到servlet包的问题,真是因为servlet为jdk的扩展包,所以在使用时需要指定classpath,具体方法 -- set classpath=%Tomcat%\common\lib\servlet.jar
如果不指定classpath,可以采用如下方法:
--将C:\Tomcat 5.0\common\lib\servlet-api.jar     servlet-api.jar  文件拷贝到JDK安装路径下的jre\lib\ext\下


C:\Tomcat 5.0\conf\server.xml
<Context path='/test' docBase="d:\testWeb" reloadable="true"/>


//隐藏文件到web-inf中 /  设置初始化参数
D:\testWeb\WEB-INF\WEB.XML
<!-- JSPC servlet mappings start -->

 <servlet>
  <servlet-name>mldn</servlet-name>
  <jsp-file>/WEB-INF/sdemo.jsp</jsp-file>
  <init-param>
   <param-name>uname</param-name>
   <param-value>mldn</param-value>
  </init-param>
  <init-param>
   <param-name>upass</param-name>
   <param-value>lxh</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>mldn</servlet-name>
  <url-pattern>/lxh</url-pattern>
 </servlet-mapping>

<!-- JSPC servlet mappings end -->


//servlet通用格式
package cn.mldn.lxh.servlet.SimpleServlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

public class SimpleServlet extends HttpServlet
{
 public void init(ServletConfig config) throws ServletException
 {
  System.out.println("**Servlet 初始化 ...") ;
 }
 public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
 {
  PrintWriter out = resp.getWriter() ;
  out.println("<html>") ;
  out.println("<head>") ;
  out.println("<title>the first servlet</title>") ;
  out.println("</head>") ;
  out.println("<body>") ;
  
  out.println("<h1>hello world</h1>") ;
  
  out.println("</body>") ;
  out.println("</html>") ;
  
 }
 
  public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
 {
  this.doPost(req,resp) ;
  
 }
 
 public void destroy()
 {
  System.out.println("**Servlet销毁 ...") ;
 }
};
//servlet配置
<servlet>
 <servlet-name>simple</servlet-name>
 <servlet-class>cn.mldn.lxh.servlet.SimpleServlet</servlet-class>
</servlet>

<servlet-mapping>//多地址访问同一servlet
 <servlet-name>simple</servlet-name>
 <url-pattern>/demo</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
 <servlet-name>simple</servlet-name>
 <url-pattern>/demo.fad</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
 <servlet-name>simple</servlet-name>
 <url-pattern>/dfa</url-pattern>
</servlet-mapping>
<servlet-mapping>//多地址访问同一servlet
 <servlet-name>simple</servlet-name>
 <url-pattern>/hello/*</url-pattern>
</servlet-mapping>

 

 

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.sql.*"%>
<%--          JDBC-ODBC 连接方式       --%>
<%!
  //定义数据库驱动程序
  String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
  
  //定义数据库连接地址,用JDBC-ODBC 则格式 固定如下
  String DBURL = "jdbc:odbc:mldn" ;
  
  //定义数据连接对象,属于java.sql包中的接口
  Connection conn = null ;
  
  //定义Statement对象,用于操纵数据库
  Statement stmt = null ;
  
  //定义一个字符串变量,用于保存SQL语句
  String sql = null ;
%>

<%
  //1、加载驱动程序
  try
  {
    Class.forName(DBDRIVER) ;
  }
  catch(Exception e)
  {
    //此处使用out.println是出于演示目的,在实际开发中所有的错误
    //消息绝对不可以用out.println打印,否则会存在安全问题
    out.println("数据库驱动程序加载失败!!!") ;
  }
  
  //2、连接数据库
  try
  {
    conn = DriverManager.getConnection(DBURL) ;
  }
  catch(Exception e)
  {
    out.println("数据库连接失败!!!") ;
  }
  
  //3、操纵数据库
  //通过Connection对象实例化Statement对象
  try
  {
    stmt = conn.createStatement() ;
    // 为sql变量赋值
    //sql = "insert into person (name,password,age) values('lxh','zzzzzz','28')" ;
    sql = "update person set name='李新华',password='mldn' where id='1'" ;
    stmt.executeUpdate(sql) ;
  }
  catch(Exception e)
  {
    out.println("操作数据库失败!!!") ;
  }
  
  //4、关闭数据库
  try
  {
    //关闭操作
    stmt.close();
    //关闭连接
    conn.close();
    
  }
  catch(Exception e)
  {
    out.println("关闭数据库失败!!!") ;
  }
%>


利用JDBC开发Web数据库一般步骤:
装入JDBC驱动程序
创建与数据库的连接
创建语句对象----Statement / PrepareStatement
利用语句对象执行SQL语句得到结果
处理结果
JDBC应用结束

 
JavaBean 打包   javac –d . SimpleBean.java
upload.htm
<jsp:useBean id="sb" scope="page" class="cn.mldn.lxh.SimpleBean"/>

<form action="upload.jsp" method="post" ENCTYPE="multipart/form-data">
选择要上传的图片:<input type="file" name="pic">
<input type="submit" value="提交">
</form>

upload.jsp
<jsp:useBean id="smart" scope="page" class="org.lxh.smart.SmartUpload"/>
<%
 // 1、上传初始化
 smart.initialize(pageContext) ;
 // 2、准备上传
 smart.upload() ;
 // 3、保存上传的文件
 // smart.save("/upload") ;
 String ext = smart.getFiles().getFile(0).getFileExt() ;
%>

<%
 String name = smart.getRequest().getParameter("name") ;
%>
<%
 // 保存文件
 smart.getFiles().getFile(0).saveAs("/upload/"+name+"."+ext) ;
%>


//使用JSP标签去调用JavaBean时必须有一个无参构造函数

//两种方法调用JavaBean 。 一种是import导入  另一种用jsp的标签指令<jsp:useBean  .../>

//使用JAVABEAN自动设置内容时,一定要使参数名称与Bean中属性名称一致,这样通过Java的命名规范,可以达到统一。


使用MyEclipse运行WEB程序有以下两种方法:
1、直接通过MyEclipse在服务器上进行部署(了解即可)
2、通过外接服务器的方式运行程序(推荐)
修改conf/server.xml文件

 

与jsp页面中服务器跳转指令<jsp:forward page="mvcdemo.jsp"/>类似
Servlet跳转到JSP的服务器端跳转的指令是:req.getRequestDispatcher("mvcdemo.jsp").forward(req,resp) ;

我们可以发现:
使用MVC开发程序,代码稍微复杂
JSP与JavaBean之间没有什么特别明显的直接关系
而Servlet根据JavaBean返回的内容进行跳转

Servlet中最好只有以下几种代码:
接收参数
调用JavaBean
进行跳转
有一些简单的逻辑判断

 

//表达式语句取集合中的值

<%@page import="java.util.*"%>
<%--

--%>

<%
  List l = (List)request.getAttribute("all") ;
  Iterator iter = l.iterator() ;
  while(iter.hasNext())
  {
   pageContext.setAttribute("sim",iter.next()) ;
%>
<h1>${sim.name}</h1>

<%
}
%>

 


监听器
一、对ServletContext监听
1、ServletContextListener:对整个Servlet上下文监听(启动、销毁)
2、ServletContextAttributeListener:对Servlet上下文属性的监听
二、对Session监听
对session的创建、销毁、属性操作
1、HttpSessionListener: 对session整体状况的监听
2、HttpSessionAttributeListener:对session的属性监听

Session如何失效
1、session超时
   需要在web.xml中进行设置
   <session-config>
 <session-timeout>1</session-timeout>
   </session-config>
2、手工使session失效
   invalidate():使session失效            session.invalidate()  ;

 

 

 

 

 

同步问题的解决

class Demo implements Runnable
{
 private int ticket = 10 ;
 // 加入一个同步方法
 public synchronized void fun()
 {
  // 把需要同步的地方放在同步方法之中
  if(this.ticket>0)
  {
   try
   {
    Thread.sleep(100) ;
   }
   catch (Exception e)
   {
   }
   System.out.println(Thread.currentThread().getName()+" --> 卖票:"+this.ticket--) ;
  }
 }
 public void run()
 {
  while(ticket>0)
  {
   this.fun() ;
  }
 }
};
public class ThreadDemo14
{
 public static void main(String args[])
 {
  Demo d = new Demo() ;
  Thread t1 = new Thread(d,"售票点 A") ;
  Thread t2 = new Thread(d,"售票点 B") ;
  Thread t3 = new Thread(d,"售票点 C") ;

  t1.start() ;
  t2.start() ;
  t3.start() ;
 }
};

 

 

 

死锁问题的解决
class Person
{
 // 两种情况: 李兴华  作者
 //    MLDN  网站
 private String name = "李兴华" ;
 private String content = "作者" ;
 private boolean flag = false ;
 // 加入一个设置的同步方法
 public synchronized void set(String name,String content)
 {
  // 如果为绿灯则表示可以设置,否则等待:true
  // 值是假,则表示要等待不能去设置
  if(flag)
  {
   try
   {
    wait() ;
   }
   catch (Exception e)
   {
   }
  }
  this.name = name ;
  try
  {
   Thread.sleep(100) ;
  }
  catch (Exception e)
  {
  }
  this.content = content ;
  // 设置完成之后,要改变灯
  flag = true ;
  notifyAll() ;
 }
 public synchronized String get()
 {
  if(!flag)
  {
   try
   {
    wait() ;
   }
   catch (Exception e)
   {
   }
  }
  String str = this.name+" --> "+this.content ;
  // 如果为红灯,则表示可以取,否则等待:false
  flag = false ;
  notifyAll() ;
  return str ;
 }
};
class Pro implements Runnable
{
 private Person per = null ;
 public Pro(Person per)
 {
  this.per = per ;
 }
 public void run()
 {
  for(int i=0;i<100;i++)
  {
   if(i%2==0)
   {
    per.set("MLDN","网站") ;
   }
   else
   {
    per.set("李兴华","作者") ;
   }
  }
 }
};

class Cust implements Runnable
{
 private Person per = null ;
 public Cust(Person per)
 {
  this.per = per ;
 }
 public void run()
 {
  for(int i=0;i<100;i++)
  {
   System.out.println(per.get()) ;
  }
 }
} ;

public class ThreadDemo19
{
 public static void main(String args[])
 {
  Person per = new Person() ;
  Pro p = new Pro(per)  ;
  Cust c = new Cust(per) ;

  new Thread(p).start() ;
  new Thread(c).start() ;
 }
};

 


// 建立一个Person类,把Person类的对象序列化
import java.io.* ;

class Person implements Serializable
{
 private String name ;
 private transient int age ;
 public Person(String name,int age)
 {
  this.name = name ;
  this.age = age ;
 }
 public String toString()
 {
  return "姓名:"+this.name+",年龄:"+this.age ;
 }
};
public class IODemo26
{
 public static void main(String args[]) throws Exception
 {
  Person per = new Person("李兴华",30) ;
  ser(per) ;
  System.out.println(dser()) ;
 }
 // 建立一个方法用于完成对象的序列化
 public static void ser(Person per) throws Exception
 {
  ObjectOutputStream oos = null ;
  oos = new ObjectOutputStream(new FileOutputStream(new File("f:\\lxh.txt"))) ;
  oos.writeObject(per) ;
  oos.close() ;
 }
 // 反序列化
 public static Person dser() throws Exception
 {
  ObjectInputStream ois = null ;
  ois = new ObjectInputStream(new FileInputStream(new File("f:\\lxh.txt"))) ;
  Object obj = ois.readObject() ;
  ois.close() ;
  return (Person)obj ;
 }
};

 


仿dos copy程序

import java.io.* ;

public class Copy
{
 public static void main(String args[])
 {
  if(args.length!=2)
  {
   System.out.println("请输入正确的格式的参数: (例如:java Copy d:\\\\input.txt d:\\\\output.txt") ;
   return ;
  }
  else
  {
   File file1 = new File(args[0]) ;
   File file2 = new File(args[1]) ;
   copyFile(file1,file2) ;
  }
 }
 
 public static void copyFile(File srcfile,File desfile)
 {
  byte[] b = new byte[512] ;//512可以改成其它大于零的适当整数值
  int len = 0 ;
  try
  {
    FileInputStream fis = new FileInputStream(srcfile) ;
    FileOutputStream fos = new FileOutputStream(desfile) ;
   while((len=fis.read(b))!=-1)//循环以512字节拷贝,知道拷贝完.
   {
    fos.write(b,0,len) ;
   }
   fis.close() ;
   fos.close() ;
  }
  catch(Exception e)
  {
   System.out.println(e) ;
  }
 }
};

 

 

类集
Collection: Collection下存放的就是一个个对象,每次存放单个对象
Maps: 每次存放一对值 key -> value
Iterator: 输出接口,只要是集合都要去使用iterator输出

Collection接口:在一般开发中为了清楚的表现处理数据的存放往往不直接使用Collection接口
    子接口:List
    子接口:Set
List既然是一个接口,则使用必须依靠子类 -> ArrayList
    如果要使用List ,则格式为: List l = new ArrayList() ;
如果去使用类集则在加入对象时最好只加入一种对象.
如果希望可以一个个元素打印出来,可以有两种方法:
1.使用for循环 , size()方法求出对象数组的长度
for(int i=0;i<all.size();i++)
{
 System.out.println(all.get(i)) ;
}
2.实际开发中一般用Iterator输出
  因为集合的长度不固定,所以iterator采用的方法是一个一个判断输出
  如果有下一个元素,则执行,如果没有则不执行
while(iter.hasNext())
{
 Object obj = iter.next() ;
 System.out.println(obj) ;
}

Collection 集合操作的主要方法
 向集合中加入数据: public boolean add(Object obj)
 从集合中删除数据: public boolean remove(Object obj) / public boolean remove(int index)
 为Iterator实例化: public Iterator iterator()
 取出元素的个数  : public int size()

Set的基本使用与List一致,但是HashSet子类存放时是无序的(散列存放)
Set与List第二个区别:
 List中的数据允许重复元素,重复元素保留下来
 Set中的数据不允许重复元素,重复元素被替换掉
在Set中如果使用HashSet则属于散列的无序的存放,如果希望有序存放使用TreeSet子类


Map的主要功能是作为查找使用,而不是作为输出使用
存数据的方法:
 put(Object key,Object value)
取内容: 根据 key 取
 Object get(Object key)
Map 接口的对象不能直接使用Iterator输出
 如果非要使用Iterator输出Map接口对象的内容,必须使用以下的步骤:
 Map -> Set -> Iterator -> Map Entry -> key , value

分清楚以下几点:
保存单个值的集合:Collection
 List: 允许有重复元素
  Arraylist: 同步处理,新的类,只能用Iterator输出
  Vector: 同步处理,旧的类,能用Iterator和Enumeration同时输出
 Set: 不允许有重复元素
  HashSet: 散列,无序
  TreeSet: 有序,按Comparable排序
保存一对值: Map
 HashMap: 异步处理,新的类
 Hashtable: 同步处理,旧的类
 TreeMap: 按KEY进行排序的集合
输出
 Iterator: 新的输出类,方法名称较短
 Enumeration: 新的输出类,方法名称较长

 


对象克隆(复制)实例:
要完成克隆的类必须具备以下两种条件
1.类必须实现Cloneable接口,表示可以被克隆
2.类必须覆写Object类中的clone方法
import java.util.* ;
class Person implements Cloneable
{
 private String name ;
 private int age ;
 public Person(String name,int age)
 {
  this.name = name ;
  this.age = age ;
 }
 public String toString()
 {
  return "姓名: "+this.name+" 年龄:"+this.age ;
 }
 public Object clone()
                throws CloneNotSupportedException
       {
           return super.clone() ;
       }
};
public class Demo01
{
 public static void main(String args[])
 {
  Person p1 = new Person("李新华",33) ;
  try
  {
   Person p2 = (Person)p1.clone() ;
   System.out.println(p2) ;
  }
  catch(Exception e)
  {
  }
  
 }
};

 

比较器:Comparable
Arrays类 -> 专门用于数组排序的
可以对任意数据类型排序
例题: 给出一个Person类里面包含姓名、年龄、成绩,声明5个Person对象的对象数组,要求对数组
中的内容进行排序,排序规则如下:
 按成绩进行排序,如果成绩一样,按年龄由高到低进行排序

import java.util.* ;
class Person implements Comparable //对象比较的类必须实现Comparable接口
{
 private String name ;
 private int age ;
 private float score ;
 public Person(String name,int age,float score)
 {
  this.name = name ;
  this.age = age ;
  this.score = score ;
 }
 public String toString()
 {
  return "姓名:"+this.name+"年龄:"+this.age+"成绩:"+this.score ;
 }
 // 覆写compareTo方法就是排序规则
 public int compareTo(Object obj)
 {
  Person per = (Person)obj ;
  if(per.score > this.score)
  {
   return 1 ;//成绩由高到底排列
  }
  else if(per.score < this.score)
  {
   return -1 ;
  }
  else
  {
   if(per.age > this.age)
   {
    return 1 ;
   }
   else if(per.age < this.age)
   {
    return -1 ;
   }
   else
   {
    return 0 ;
   }
  }
 }
};

public class Demo01
{
 public static void main(String args[])
 {
  Person[] p = new Person[5] ;
  p[0] = new Person("张三",23,99) ;
  p[1] = new Person("李四",19,99) ;
  p[2] = new Person("张三",23,77) ;
  p[3] = new Person("张三",18,88) ;
  p[4] = new Person("张三",21,78) ;
  Arrays.sort(p) ;
  for(int i=0;i<p.length;i++)
  {
   System.out.println(p[i]) ;
  }
  
 }
};
比较器除了在Arrays类的排序外还可以用在TreeSet上,实际上TreeSet也需要比较器支持
public class Demo01
{
 public static void main(String args[])
 {
  Set<Person> s = new TreeSet<Person>() ;
  s.add(new Person("张三",23,99)) ;
  s.add(new Person("李四",19,99)) ;
  s.add(new Person("张三",23,77)) ;
  s.add(new Person("张三",18,88)) ;
  s.add(new Person("张三",21,78)) ;
  Iterator iter = s.iterator() ;
  while(iter.hasNext())
  {
   System.out.println(iter.next()) ;
  } 
 }
};

Class类
类->对象
我希望由对象能够知道其所属的类是哪个
     void printClassName(Object obj) {
         System.out.println("The class of " + obj +
                            " is " + obj.getClass().getName());
     }

Class能够动态为类实例化
Class类本身没有任何构造方法
import java.util.* ;
public class AdvDemo08
{
 public static void main(String args[]) throws Exception
 {
  // 通过代码验证
  List all = null ;

  // all = new ArrayList() ;

  // 根据字符串找到一个类
  Class c = Class.forName("java.util.ArrayList") ;
  all = (List)c.newInstance() ;

  all.add("A") ;
  all.add("B") ;
  all.add("C") ;

  System.out.println(all) ;
 }
};

总结: JAVA中对象实例化的途径
1. 直接用new: 代码比较直观,但是程序会出现耦合度
2. 程序出现了接口,如果一个接口的子类直接通过new实例化会造成程序耦合,所以使用工厂进行解耦合操作
3. 对象的克隆,将对象拷贝一份,但是此种方法需要在子类中覆写clone()
4. Class类,通过Class类来实例化一个对象,通过字符串操作完成

关于Class类只需重点掌握实例化对象的操作

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics