Goodwin

继续向前 永不停止

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  24 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

2010年12月8日 #

用工厂方法产生一个SAXPareser实例:

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser pareser = factory.newSAXParser();

我们需要写一个事件处理类来驱动parser的Callback方法,只需要实现部分方法所以我们继承DefaultHandler类即可,DefaultHandler提供了ContentHandler的默认实现。我们需要实现一下方法:

void characters(char[] ch, int start, int length)

void endElement(String uri, String localName, String name)

void startDocument()

startElement(String uri, String localName, String name,
Attributes attributes)

startElement(String uri, String localName, String name, Attributes attributes)

然后打开一个RSS的URL获得输入流

InputStream inputStream = new URL(“http://…”).openConnection().getInputStream();

分析feed

pareser.parse(inputStream,handler);

详细的实现代码:

//定义一个接口,方便扩展,可以用其他的XML分析API

import java.util.List;

public interface FeedParser {
	List<Message> parse();
}

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public abstract class BaseFeedParser implements FeedParser {

	// names of the XML tags
	static final String CHANNEL = "channel";
	static final String PUB_DATE = "pubDate";
	static final  String DESCRIPTION = "description";
	static final  String LINK = "link";
	static final  String TITLE = "title";
	static final  String ITEM = "item";
	
	private final URL feedUrl;

	protected BaseFeedParser(String feedUrl){
		try {
			this.feedUrl = new URL(feedUrl);
		} catch (MalformedURLException e) {
			throw new RuntimeException(e);
		}
	}

	protected InputStream getInputStream() {
		try {
			return feedUrl.openConnection().getInputStream();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
}

import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxFeedParser extends BaseFeedParser {

	protected SaxFeedParser(String feedUrl){
		super(feedUrl);
	}
	
	public List<Message> parse() {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			SAXParser parser = factory.newSAXParser();
			RssHandler handler = new RssHandler();
			parser.parse(this.getInputStream(), handler);
			return handler.getMessages();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} 
	}
}

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import static org.developerworks.android.BaseFeedParser.*;

public class RssHandler extends DefaultHandler{
	private List<Message> messages;
	private Message currentMessage;
	private StringBuilder builder;
	
	public List<Message> getMessages(){
		return this.messages;
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		builder.append(ch, start, length);
	}

	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		super.endElement(uri, localName, name);
		if (this.currentMessage != null){
			if (localName.equalsIgnoreCase(TITLE)){
				currentMessage.setTitle(builder.toString());
				System.out.println(builder.toString());
			} else if (localName.equalsIgnoreCase(LINK)){
				currentMessage.setLink(builder.toString());
				System.out.println(builder.toString());
			} else if (localName.equalsIgnoreCase(DESCRIPTION)){
				currentMessage.setDescription(builder.toString());
				System.out.println(builder.toString());
			} else if (localName.equalsIgnoreCase(PUB_DATE)){
				currentMessage.setDate(builder.toString());
				System.out.println(builder.toString());
			} else if (localName.equalsIgnoreCase(ITEM)){
				messages.add(currentMessage);
				System.out.println(builder.toString());
			}
			builder.setLength(0);	
			
		}
	}

	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
		messages = new ArrayList<Message>();
		builder = new StringBuilder();
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, name, attributes);
		if (localName.equalsIgnoreCase(ITEM)){
			this.currentMessage = new Message();
		}
	}
}

public abstract class FeedParserFactory {
	static String feedUrl = "http://www.androidster.com/android_news.rss";
	
	public static FeedParser getParser(){
		return getParser(ParserType.SAX);
	}
	
	public static FeedParser getParser(ParserType type){
		switch (type){
			case SAX:
				return new SaxFeedParser(feedUrl);
			case DOM:
				return new DomFeedParser(feedUrl);
			case ANDROID_SAX:
				return new AndroidSaxFeedParser(feedUrl);
			case XML_PULL:
				return new XmlPullFeedParser(feedUrl);
			default: return null;
		}
	}
}

posted @ 2010-12-08 11:47 Goodwin 阅读(170) 评论(0) 编辑

在编码时,要对sdcard进行写入或删除操作时候要给与WRITER_EXTERNAL_STORAGE权限

在AndroidManifest.xml中加入

<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />

其他权限:

<uses-permission android:name=”android.permission.READ_CONTACTS” />
<uses-permission android:name=”android.permission.WRITE_CONTACTS” />
<uses-permission android:name=”android.permission.VIBRATE” />
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />
<uses-permission android:name=”android.permission.INTERNET” />
<uses-permission android:name=”android.permission.SET_WALLPAPER” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
<uses-permission android:name=”android.permission.SEND_SMS” />
<uses-permission android:name=”android.permission.RECEIVE_SMS” />
<!– We will request access to the camera, saying we require a camera
of some sort but not one with autofocus capability. –>
<uses-permission android:name=”android.permission.CAMERA” />
<uses-feature android:name=”android.hardware.camera” />
<uses-feature android:name=”android.hardware.camera.autofocus” android:required=”false” />
posted @ 2010-12-08 11:40 Goodwin 阅读(527) 评论(0) 编辑

2010年11月1日 #

分治算法通俗的讲就是把一个规模比较大的问题分成n个规模较小的问题来解决,再将每个小规模的问题进行合并,最后得到结果。通常问题规模比较大难以用普通的编程方法实现,或者不可能实现的时候采用分治算法,能够简化问题的解决。

一个例子:

求出一个数组中的最大值和最小值。

package example;

public class MaxAndMinValue {

	// 直接算法 得到最大值和最小值
	public static void main(String[] args) {
		int[] A = { -18, -16, 9, -5, 7, -40, 0, 35 };
		System.out.println(getMaxValue(A));
		System.out.println(getMinValue(A));
		System.out.println(getMax(A, 0, A.length - 1));

	}

	// 直接算法求最大值
	public static int getMaxValue(int[] array) {
		int Max = 0;
		for (int i = 0; i < (array.length - 1); i++) {
			if (array[i] == array[i + 1]) {
				Max = array[i + 1];
			}
			if (array[i] < array[i + 1]) {
				Max = array[i + 1];
			}
			if (array[i] > array[i + 1]) {
				Max = array[i];
				array[i] = array[i + 1];
				array[i + 1] = Max;

			}
		}
		return Max;
	}

	// 直接算法求最小值
	public static int getMinValue(int[] array) {

		int Min = 0;
		for (int i = 0; i < (array.length - 1); i++) {
			if (array[i] == array[i + 1]) {
				Min = array[i + 1];
			} else if (array[i] < array[i + 1]) {
				Min = array[i];
				array[i] = array[i + 1];
				array[i + 1] = Min;
			} else if (array[i] > array[i + 1]) {
				Min = array[i + 1];
			}
		}
		return Min;
	}

	// 用分治法求最大最小值
	public static int getMax(int[] array, int i, int j) {
		int Max1 = 0;
		int Max2 = 0;
		if (i == j) {
			return Max1 = Max2 = array[j];
		} else if (i == (j - 1)) {
			Max1 = array[i];
			Max2 = array[j];
			return Max1 > Max2 ? Max1 : Max2;
		} else {
			int mid = (i + j) / 2;
			Max1 = getMax(array, i, mid);
			Max2 = getMax(array, mid, j);
			return Max1 > Max2 ? Max1 : Max2;
		}
	}
}

 

假设数组的大小为8,用直接的算法,最大值最小值总需要比较14次,而用分治算法可以一次性求出最大和最小,只需要10次比较。

posted @ 2010-11-01 16:48 Goodwin 阅读(652) 评论(1) 编辑

2010年10月6日 #

OneToOne

 

public classEmployee implements Serializable {

         ……

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)

    @JoinColumn(name = "ADDR_ID")

  private Address address;

… …

}

 

 

ManyToOne

 

public classEmployee implements Serializable {

         ……

    @ManyToOne(fetch = FetchType.LAZY)

    @JoinTable(name = "EMP_JOB", joinColumns = @JoinColumn(name = "EMP_ID"), inverseJoinColumns = @JoinColumn(name = "TITLE_ID"))

    //連接表 joinColumns參考主表的主鍵的列,inverseJoinColumns參考字段或屬性生成的表格的主鍵的列

  private JobTitle jobTitle;


    @ManyToOne(fetch = FetchType.LAZY)

    @JoinColumn(name = "MANAGER_ID")

  private Employee manager;

… …

}

 

 

OneToMany

 

public classEmployee implements Serializable {

         ……

    @OneToMany(mappedBy = "manager") //manager字段擁有關係

    private List<Employee> managedEmployees = newArrayList<Employee>();


    @OneToMany(mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true)

  private List<PhoneNumber> phoneNumbers = newArrayList<PhoneNumber>();


    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

    @JoinColumn(name="EMP_ID")

    private List<Degree> degrees = newArrayList<Degree>();

         ……

}

 

 

ManyToMany

public classEmployee implements Serializable {

         ……

    @ManyToMany

    //連接表

    @JoinTable(name = "PROJ_EMP", joinColumns = @JoinColumn(name = "EMP_ID"), inverseJoinColumns = @JoinColumn(name = "PROJ_ID"))

   private List<Project> projects = newArrayList<Project>();

… …

}

 

 

联合主键映射

ManyToOne OneToMany ManyToMany映射,而且采用JoinTable映射,会出现联合主键,即双主键。

posted @ 2010-10-06 14:57 Goodwin 阅读(349) 评论(0) 编辑

一个实体类必须遵循一下要求:

1.        类必须用javax.persistence.Entity注释

2.        类必须有一个public或protected的无参数构造器。可以有其他的构造器。

3.        类不准许声明为final。

4.        实体类可以继承实体类也可以继承非实体类。非实体类可以继承实体类。

 

JPA中可以持久化的字段类型:

  • Java原始类型
  • Java.lang.String
  • 可序列化类型
  • Wrappersof Java primitive types
  • java.math.BigInteger
  • java.math.BigDecimal
  • java.util.Date
  • java.util.Calendar
  • java.sql.Date
  • java.sql.Time
  • java.sql.TimeStamp
  • User-definedserializable types
  • byte[]
  • Byte[]
  • char[]
  • Character[]
  • 枚举类型Enumerated Types
  • 其他实体或实体集合
  • 内嵌类

 

基本实体映射

@Entity

@SecondaryTable(name = "SALARY")

public class Employee implements Serializable {

    @Id

    @Column(name = "EMP_ID")

    @GeneratedValue(strategy = GenerationType.SEQUENCE)

    private long id;

 

@Basic

    @Version

private long version;

 

    @Basic

    @Column(name = "F_NAME")

    private String firstName;

 

    @Basic

    @Column(name = "L_NAME")

    private String lastName;

 

    @Basic

    @Column(name = "GENDER")

    @Enumerated(EnumType.STRING)

    private Gender gender = Gender.Male;

 

    @Column(table = "SALARY")

    private double salary;

         ……

}

 

 

 

抽象的实体注释

@Entity

public abstract class Employee {

    @Id

    protectedInteger employeeId;

    ...

}

@Entity

public class FullTimeEmployee extends Employee {

    protectedInteger salary;

    ...

}

@Entity

public class PartTimeEmployee extends Employee {

    protected FloathourlyWage;

}

 

 

超类映射

 

@MappedSuperclass
public class Employee {
    @Id
    protected Integer employeeId;
    ...
}
@Entity
public class FullTimeEmployee extends Employee {
    protected Integer salary;
    ...
}
@Entity
public class PartTimeEmployee extends Employee {
    protected Float hourlyWage;
    ...
}

 

内嵌实体类映射

@Embeddable

//內嵌到其他實體,與其共享identity

public class EmploymentPeriod {

    //@Temporal必須為java.util.Date and java.util.Calendar類型的字段或屬性註釋,

    //而且只能為這些類型的字段或屬性註釋。

    @Temporal(TemporalType.DATE)

    private Calendar startDate;

    @Temporal(TemporalType.DATE)

private Calendar endDate;

… …

}

public classEmployee implements Serializable {

    … …

    @Embedded

    @AttributeOverrides( {

        @AttributeOverride(name = "startDate", column = @Column(name = "START_DATE")),

        @AttributeOverride(name = "endDate", column = @Column(name = "END_DATE")) })

    private EmploymentPeriod period;

    … …

}

posted @ 2010-10-06 14:55 Goodwin 阅读(264) 评论(0) 编辑

2010年9月28日 #

 

实现文件上传,表单属性需要设置为method=”post”,encType=multipart/form-data,在服务器端通过request.getInputStream()获得文件输入流,然后对流进行操作,获得所需要的内容。

 

 

Html页面代码upload.html

<form action="UploadServlet3" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" name="upload"value="上传">
</form>

1.实现基本文件上传

Servlet代码

public class UploadServlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

           InputStream in = request.getInputStream();
           File f = new File("d:/temp","aaa.txt");
           FileOutputStream fos = new FileOutputStream(f);

           byte[] b = new byte[1024];
           int n=0;

           while((n=in.read(b))!=-1){
              fos.write(b,0,n);
           }

           fos.close();
           in.close();

    }

}

此方法上传的文件打开后如下:

-----------------------------26962244645705

Content-Disposition: form-data; name="file";filename="a.txt"

Content-Type: text/plain

 

Java Servlet Technology

As soon as the web began to be used for deliveringservices, service providers recognized the need for dynamic content. Applets,one of the earliest attempts toward this goal, focused on using the clientplatform to deliver dynamic user experiences. At the same time, developers alsoinvestigated using the server platform for this purpose. Initially, CommonGateway Interface (CGI) scripts were the main technology used to generatedynamic content. Although widely used, CGI scripting technology has a number ofshortcomings, including platform dependence and lack of scalability. To addressthese limitations, Java Servlet technology was created as a portable way toprovide dynamic, user-oriented content.

-----------------------------26962244645705

Content-Disposition: form-data; name="upload"

 

上传

-----------------------------26962244645705--

此处有一个回车符

前面4行和后面6行是表单的一些属性,是默认加入的。

 

2.出去文件流中的多余内容(只支持ie)

UploadServlet2

public class UploadServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String tempFileName = (String) request.getSession().getId();
		// create the tempfile.
		File temp = new File("d:/temp", tempFileName);
		FileOutputStream o = new FileOutputStream(temp);
		if (request.getContentLength() > 297) {
			// write theupload content to the temp file.
			InputStream in = request.getInputStream();
			byte b[] = new byte[1024];
			int n;
			while ((n = in.read(b)) != -1) {
				o.write(b, 0, n);
			}
			o.close();
			in.close();
			// read the tempfile.
			RandomAccessFile random = new RandomAccessFile(temp, "r");
			// read Line2 tofind the name of the upload file.
			int second = 1;
			String secondLine = null;
			while (second <= 2) {
				secondLine = random.readLine();
				second++;
			}

			// get the lastlocation of the dir char.'\\'.
			int position = secondLine.lastIndexOf('\\');
			// get the nameof the upload file.
			String fileName = secondLine.substring(position + 1,
					secondLine.length() - 1);
			// relocate tothe head of file.
			random.seek(0);
			// get thelocation of the char.'Enter' in Line4.
			long forthEndPosition = 0;
			int forth = 1;
			while ((n = random.readByte()) != -1 && (forth <= 4)) {
				if (n == '\n') {
					forthEndPosition = random.getFilePointer();
					forth++;
				}
			}
			File realFile = new File("d:/temp", fileName);
			RandomAccessFile random2 = new RandomAccessFile(realFile, "rw");
			// locate the endposition of the content.Count backwards 6 lines.
			random.seek(random.length());
			long endPosition = random.getFilePointer();
			long mark = endPosition;
			int j = 1;
			while ((mark >= 0) && (j <= 6)) {
				mark--;
				random.seek(mark);
				n = random.readByte();
				if (n == '\n') {
					endPosition = random.getFilePointer();
					j++;
				}
			}
			// locate to thebegin of content.Count for 4 lines's end position.
			random.seek(forthEndPosition);
			long startPoint = random.getFilePointer();
			// read the realcontent and write it to the realFile.
			while (startPoint < endPosition - 1) {
				n = random.readByte();
				random2.write(n);
				startPoint = random.getFilePointer();
			}
			random2.close();
			random.close();
			// delete the tempfile.
			temp.delete();
			System.out.println("File uploadsuccess!");
		} else {
			System.out.println("Nofile!");
		}

	}

}

posted @ 2010-09-28 11:07 Goodwin 阅读(495) 评论(2) 编辑

2010年9月13日 #

什么是servlet?

Servlet是一个java语言类,用来扩展servlet服务器的功能。Servlet对客户端的request作出response。

Servlet的写法

java.servlet包和java.servlet.http包提供了接口和类来写servlet。所有的servlet类都必须实现servlet接口。在这里sun帮我们编写了一个HttpServlet类,是一个抽象类,实现了Servlet接口,那我们在写servlet的类时候继承HttpServlet类实现其中所需要的方法即可。

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
 {…  } 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
 {  …  }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}

Servlet架构

posted @ 2010-09-13 17:09 Goodwin 阅读(30) 评论(0) 编辑

2010年9月10日 #

摘要: 一、使浏览器不缓存页面的过滤器 二、检测用户是否登陆的过滤器三、字符编码的过滤器 四、资源保护过滤器 五、利用Filter限制用户浏览权限在一个系统中通常有多个权限的用户。不同权限用户的可以浏览不同的页面。使用Filter进行判断不仅省下了代码量,而且如果要更改的话只需要在Filter文件里动下就可以。以下是Filter文件代码:要传递参数的时候最好使用form进行传参,如果使用链接的话当中文...阅读全文
posted @ 2010-09-10 20:10 Goodwin 阅读(305) 评论(2) 编辑

2010年6月24日 #

摘要: javascript中的正则表达式对象regExp。创建regExp对象语法new regExp(pattern,attributes);直接量语法/pattern/attributes 也可以是new regExp(/pattern/attributes)注意:如果用new regExp(pattern,attributes)创建对象pattern作为一个字符串需要加引号"";如果用直接量语法,...阅读全文
posted @ 2010-06-24 20:35 Goodwin 阅读(63) 评论(0) 编辑

2010年6月21日 #

摘要: &与&&的区别:& : 两个表达式中,如果前一个表达式的值为false,继续执行下一个表达式。&&:两个表达式中,如果前一个表达式的值为false,跳过下一个表达式。逻辑运算中,表达式有一个为假,结果为假,所以&&效率比&高。String与StringBuffer的区别请看http://blog.csdn.net/yirent...阅读全文
posted @ 2010-06-21 23:46 Goodwin 阅读(47) 评论(0) 编辑