??xml version="1.0" encoding="utf-8" standalone="yes"?> 注意Qvi命oq不锁住所~辑的文Ӟ因此多个用户可能在同时编辑一个文Ӟ那么最后?br />保存的文件版本将被保留。?/p> 下面是vi命o使用的一些选项及含义: -c sub-command 在对指定的文件编辑前Q先执行指定的命令 sub-command . -r filename 恢复指定的文件filename . -R 指定的文g以只ȝ方式攑օ~辑器中Q这样不会保存对文g的Q何修 攏V?/p> -y number 编辑窗口的大小设ؓnumber行。 ?/p> 下面是vi~辑所处的三种模式Q ?/p> .命o模式 q入vi时所处的模式。在此模式下用户可输入各U子命o对进?作,如删除行、?br />_脓行、移向下一个字、移向不同行{。?/p> .文本输入模式 在此模式下可以修改一行的内容q增L行。在命o模式下键入a 、i 或?br />c键可q入文本输入模式Q按Escape键可q回命o模式。?/p> .命oҎ式 在此模式下Q可以通过子命令输入更多的参数。如Qw子命令要求输入一文?br />件名Q?/"子命令要求输入一个查N。用户用Escape键返回命令模式。?/p> h 光标左UM根{ ?/p> l 光标右UM根{ ?/p> j 光标下UM根{ ?/p> k 光标上UM根{ ?/p> w 光标移C一个小字的前面。 ?/p> W 光标移C一个大字的前面。 ?/p> b 光标移到前一个小字的前面。 ?/p> B 光标移到前一个大字的前面。 ?/p> e 光标移C一个小字的后面。 ?/p> E 光标移到前一个大字的后面。 ?/p> fc 把光标移到同一行的下一个c字符处。 ?/p> Fc 把光标移到同一行的前一个c字符处。 ?/p> tc 把光标移到同一行的下一个字Wc的前一根{ ?/p> Tc 把光标移到同一行的前一个字Wc的后一根{ ?/p> number| 把光标移到递number列上。 ?/p> 下面是命令模式下在行间移动的子命令: +或Enter 把光标移至下一行第一个非I白字符。 ?/p> - 把光标移至上一行第一个非I白字符。 ?/p> 0 把光标移到当前行的第一个字W处。 ?/p> $ 把光标移到当前行的最后一个字W处。 ?/p> H 把光标移到屏q最端一行。 ?/p> L 把光标移到屏q最底端一行。 ?/p> M 把光标移到屏q中间。 ?/p> 下面是命令模式下改变屏幕昄的子命oQ ?/p> z- 把当前行作ؓ屏幕的最后一行,q新显C屏q。 ?/p> z. 把当前行作ؓ屏幕的中间一行,q新显C屏q。 ?/p> Ctrl+l 重新昄屏幕当前内容。 ?/p> /pattern/z- Lpattern的下一个位|,q把所在行设ؓ屏幕的最后一行。?/p> 下面是在命o模式下用来显C页面的子命令: Ctrl + f向后滚一c ?/p> Ctrl + d向后滚半c ?/p> Ctrl + b向前滚一c ?/p> Ctrl + u向前滚半c ?/p> Ctrl + e屏幕向下滚一行。 ?/p> Ctrl + y屏幕上滚一行。 ?/p> 下面是在命o模式下用来查扑֭W串所使用的子命oQ ?/p> /pattern 向后L指定的pattern ,若遇到文件尾Q则从头再开始。?/p> Qpattern 向前L指定的pattern ,若遇到文件头Q则从尾再开始。?/p> n 在上ơ指定的方向上,再次执行上次定义的查找。 ?/p> N 在上ơ指定的方向的相反方向上Q再ơ执行上ơ定义的查找。 ?/p> /pattern/+number 光标停在包含pattern的行后面Wnumber行上。?/p> /pattern/-number 光标停在包含pattern的行前面Wnumber行上。?/p> % Ud匚w?Q)"?{}"上。 ?/p> 下面是在文本输入模式下用来输入文本的子命令(用户可在M时候按Escapeq回到命令模式)Q?/p> a 在光标之后开始输入文本。 ?/p> A在行ּ始输入文本。 ?/p> i在光标之前开始输入文本。 ?/p> I在行首第一个非I白字符前输入文本。 ?/p> o在光标所在行后插入一I。 ?/p> O在光标所在行前插入一I。 ?/p> 下面是在命o模式下改变文本所使用的子命oQ用户可在Q何的时候按Escape键返回到命o模式Q: cc或S 修改一整行。 ?/p> C 改变一行光标位|以后的部分。 ?/p> cw 改变光标所在单词。 ?/p> dd删除当前行。 ?/p> D 删除光标所在行光标后面的内宏V ?/p> dw删除光标所在的单词。 ?/p> J 把下一行内容加到本行行。 ?/p> rc把光W所在字W替换成c . R 覆盖本行内容。 ?/p> u恢复上一ơ的修改。 ?/p> x删除光标所在的字符。 ?/p> ~ 改变光标所在出字符的大写。 ?/p> . 重复上一?作。 ?/p> <<把当前行Ud左边。 ?/p> >>把当前行Ud双。 ?/p> 下面是用于文件中拯文本的字命oQ ?/p> p 缓冲区内容取到光标所在行的下面一行。 ?/p> P 缓冲区内容取到光标所在行的上面一行。 ?/p> "bd 文本删除至有名~冲区b . "bp 张脓有名~冲区b中内宏V ?/p> yy把当前行攑օ~冲区。 ?/p> Y 把当前行攑օ~冲区。 ?/p> Yw把光标所在的单词攑օ~冲区。 ?/p> 下面是用于保存文件的子命令: :w 回写修改后的文g。 ?/p> :w filename 当filename不存在时Q把修改后的文g存ؓ文gfilename ,当文件filename !w filename 如果文gfilename存在Ӟ把修改后的文件保存ؓ文gfilename . 下面列出了在vi~辑的多个文件之间切换所用的子命令: :n开始编辑viȀzȝ文g列表中的下一个文件。 ?/p> :n filenames 指定被~辑的新的文件列表。 ?/p> 下面列出了用于在当前文g和另外一个文仉切换的子命oQ ?/p> :e filename 使用filenameȀzvi Q在vi中装入另一个文件filenameQ。?/p> e!重新装入当前文gQ若当前文g有改动,则丢弃以前的改动。 ?/p> :e+filename 使用filenameȀzvi ,q从文gN开始编辑。?/p> :e+number filename 使用filenameȀzvi ,q在Wnumber行开始编辑。?/p> :e# 开始编辑另外一个文件。 ?/p> 下面是在本文件中加入其他文g代码所使用的子命oQ ?/p> :r filenamedfilename文gQƈ其内容加到当前文g后。 ?/p> :r ! command执行command文gQƈ其输出加到当前文g后。 ?/p> 下面是vi中其他的子命令: ctrl+g 取得正在~辑文g的有关信息。 ?/p> :sh启动sh Q从sh中返回可用exit或ctrl+d . :! Command 执行命ocommand . !!重新执行上次?! Command子命令。 ?/p> :q退出vi Q若用户对编辑的文g有所修改Q系l不会让用户使用q命o退出。 ?/p> :q!退出vi而不是否对文g有改动。 ?/p> ZZ?wq 保存Ҏ件的修改q出vi . 用户可在一个特D的文g.exrc中定义特D的vi命o。在vi中用这些命令时Q必d该?br />命o前加上一个冒? Q? ?/p> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <appender name="error" class="org.apache.log4j.RollingFileAppender"> <logger name="biz.startup"> <logger name="com.aspire" additivity="false"> *********** log4j 配置文gl束 ************ ********** z的TimeSizeRollingFileAppenderc?**** import org.apache.log4j.FileAppender; public class TimeSizeRollingFileAppender private final static String FS = System.getProperty("file.separator"); ********** TimeSizeRollingFileAppender cȝ?****** ************ 调用CZ TestLog4jc?************** import org.apache.log4j.Logger; public class TestLog4j { public static void config(){ *************** TestLog4j end ***********
一些资?
http://www.csdn.net/subject/j2meTools/
http://news.csdn.net/news/newstopic/24/24127.shtml
]]>
]]>
下面是自命o模式下执行的Q在同一行上Ud的自命oQ ?/p>
存在Ӟ报错。?/p>
<1>所有的日志信息都输出到log.log.
<2>对于一些特D的日志Q如启动时候的日志Q,输出到log/startup/startup.log.
<3>对于某些Ҏ包下面的日志Q如com.aspire包下面的error信息都输出到error.log
有了q几个功能,怿对于大部分的pȝ都是够用的了Q下面这个例子就是实Cq几个功?
(至于其他的一些配|,如格式这些的׃说明,有很多这U资?
*********** log4j 配置文g ************
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="
<param name="File" value="log.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n"/>
</layout>
</appender>
<param name="File" value="error.log"/>
<param name="MaxBackupIndex" value="300"/>
<param name="Encoding" value="GB2312"/>
<param name="MaxFileSize" value="20MB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<!-- qo,只记录error信息-->
<param name="LevelMin" value="error"/>
<param name="LevelMax" value="error"/>
<param name="acceptOnMatch" value="true"/>
</filter>
</appender>
<appender name="startup" class="com.aspire.TimeSizeRollingFileAppender">
<!--该类使自׃FileAppenderzQ可以自己控制输出文件的路径 -->
<param name="File" value="log/startup/startup.log" />
<param name="Encoding" value="GBK" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m %d{ISO8601}- %m%n %p %l%n" />
</layout>
</appender>
<!--Logger logger = Logger.getLogger("biz.startup") 可以q样来调用本logger-->
<level value="debug" />
<appender-ref ref="startup" />
</logger>
<!--Log log = LogFactory.getLog(TestLog4j.class) 此时如果TestLog4j
位于com.aspire包下面,那么使用本logger
-->
<level value="debug"/>
<appender-ref ref="error"/>
</logger>
<root>
<level value="info"/>
<!-- 默认输出到log.log-->
<appender-ref ref="file"/>
</root>
</log4j:configuration>
package com.aspire;
import org.apache.log4j.spi.ErrorCode;
import java.io.File;
import java.io.IOException;
extends FileAppender
implements ErrorCode {
public TimeSizeRollingFileAppender() {
}
public void setFile(String file) {
String val = file.trim();
File domain = new File(".");
try {
fileName = domain.getCanonicalPath() + FS + val;
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
package com.aspire;
import org.apache.log4j.LogManager;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.commons.logging.Log;
private Logger logger = Logger.getLogger("biz.startup");
private Log log = LogFactory.getLog(TestLog4j.class);
DOMConfigurator.configure("conf\\log4jConf.xml");
}
public void Test(){
/**
* error > warn > info > debug
*/
logger.error("*****error*****");
logger.debug("****debug*****");
logger.warn("*****warn******");
logger.info("*****info******");
log.error("中华之崛?");
}
public static void main(String [] argv){
TestLog4j t = new TestLog4j();
TestLog4j.config();
t.Test();
}
}
]]>
需要耗费较长的时间或资源Q这U情况下Q我们可以考虑使用Prototype模式。我觉得q种模式实用于这L情况:如果该类的用户对于该
cȝ对象是怎么创徏的,对类的内部结构这些都不关心的情况Qƈ且该cȝ创徏q程比较Ҏ或资源时Q可以考虑使用该模式。下面是该模式的
一个例?
Prototype c?/font>
package com.moonsoft;
import java.lang.Cloneable;
public class Prototype implements Cloneable {
public String myname;
Prototype(){
System.out.println("start:"+System.currentTimeMillis());
for( int i=0; i< 9999999; i++){
}
System.out.println("end:"+System.currentTimeMillis());
}
public Object clone(){
Object o = null;
try{
o = super.clone();
}
catch(CloneNotSupportedException ex){
ex.printStackTrace();
}
return o;
}
public void whoami(){
System.out.println(myname);
}
}
试c?br />
package com.moonsoft;
public class Test {
public static void main(String [] argv){
Prototype p = new Prototype();
p.whoami();
p.myname = "loucy";
Prototype p1 = (Prototype)p.clone();
p1.whoami();
}
}
public class WebServer {
public static void main(String[] argv) throws IOException {
ServerSocket servSocket = new ServerSocket(StringUtil.LISTENING_PORT);
try {
while (true) {
Socket socket = servSocket.accept();
new SocketThread(socket).start();
}
} finally {
servSocket.close();
}
}
}
---SocketThread------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Writer;
import java.net.Socket;
public class SocketThread extends Thread {
private Socket socket = null;
public SocketThread(Socket s) {
this.socket = s;
}
public void run() {
try {
if (socket == null) {
throw new Exception("==>SOCKET为空<==");
}
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String fileName = "";
while (true) {
String str = reader.readLine();
if (str == null || str.length() <= 0) {
break;
}
//System.out.println("===>"+str);
if (StringUtil.isGetRequestInfo(str)) {
fileName = StringUtil.getFileName(str);
break;
}
}
//System.out.println("===>客户机IP==>"+socket.getInetAddress().toString());
//System.out.println("===>客户机端?=>"+socket.getPort());
/*
BufferedWriter writer = new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream()));
*/
PrintStream outputStream = new PrintStream(socket.getOutputStream());
File file = new File(StringUtil.WEBPATH + fileName);
if (file.exists()) { //如果文g存在
StringUtil.sendHttpHead(outputStream, file);
StringUtil.sendFile(outputStream, file);
outputStream.flush();
} else { //文g没找刎ͼq回404面
StringUtil.send404Page(outputStream);
outputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (Exception e) {
}
}
}
}
---StringUtil-----
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
/**
* @author xiaoliang
*/
public class StringUtil {
// 服务器监听的端口
public static final int LISTENING_PORT = 8080;
// 服务器文件的位置
public static final String WEBPATH = "E:";
/**
* 判断该字W串是不是浏览器发送过来的h头信?br /> * @param str
* @return
*/
public static boolean isGetRequestInfo(String str) {
if (str == null || str.length() <= 0)
return false;
boolean isGetStr = true;
if (str.indexOf("GET") != 0) {
isGetStr = false;
}
if (str.indexOf("HTTP/") <= 0) {
isGetStr = false;
}
return isGetStr;
}
/**
* 获得h信息中的文g?默认为index.html
*
* @param str
* @return
*/
public static String getFileName(String str) {
String fileName = "index.html", s;
int httpIndex = str.lastIndexOf("HTTP/");
s = str.substring(3, httpIndex);
s = s.trim();
if (s != null && s.length() > 0 && s.indexOf(".") > 0) {
fileName = s;
}
return fileName;
}
/**
* 发送文件到客户?br /> *
* @param out
* @param file
*/
public static void sendFile(PrintStream out, File file) {
try {
DataInputStream in = new DataInputStream(new FileInputStream(file));
int length = (int) file.length();
byte[] buffer = new byte[length];
in.readFully(buffer);
out.write(buffer, 0, length);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送返回的头部信息
* @param out
*/
public static void sendHttpHead(PrintStream outputStream, File file) {
try {
outputStream.println("HTTP/1.0200OK");
outputStream.println("Content_Type:textQhtm1");
outputStream.println("Content_Length:" + file.length());
outputStream.println("Server:moon webserver 1.0");
outputStream.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* q回404面
* @param out
*/
public static void send404Page(PrintStream out) {
try {
out.println("HTTP Q?.0 404 no found");
out.println("Content_type:text/html");
out.println("");
out.println("Error404:file not found!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] argv) {
String str = "GET /11.html HTTP/1.1";
str = StringUtil.getFileName(str);
System.out.println("==>" + str + "<==");
File file = new File(StringUtil.WEBPATH + str);
if (file.exists()) {
System.out.println("exists");
} else {
System.out.println("not exists");
}
}
}
3>CZ
//查表单是否正?BR> boolean isMultipart = FileUpload.isMultipartContent(request);
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//文g最大,设ؓ-1表示不受限制
upload.setSizeMax(4096);
//解析hQ把解析的结果放在一个List里面
List items = upload.parseRequest(request);
//~存大小Q设?1表示不受限制
factory.setSizeThreshold(4096);
//讄临时目录
factory.setRepository(new File("D:\\temp"));
Iterator iter = items.iterator();
while( iter.hasNext() ){
FileItem item = (FileItem)iter.next();
//查是一个普通的表单域还是Filelg
if( !item.isFormField() ){
System.out.println("FileName:==>"+item.getName());
System.out.println("FieldName:==>"+item.getFieldName());
System.out.println("Size:==>"+item.getSize());
//item.getName q回的是完整的文件名Q如:E:\\xx\11.doc
//所以这里用一个fullFile来取文g?BR> File fullFile = new File(item.getName());
File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
item.write(uploadedFile);
}
}
2、有状态EJBQ类似数据库的Connect链接Q也cMU程守护Q它提供引用?Bean instance pool)Q每个客L会有单独的信息?BR>例如Q在某有状态EJB中,有一个数据成员(变量Q?i_count Q整型,用于讉K计数Q初始gؓ0Q访问一ơ篏?Q,它对每个客户端来说是隔离的。某客户端访问后Q值篏加ؓ1。另一个客L讉K时还是原来的gؓ0?/P>
q里提到的数据成员(变量Q?i_count Q在EJB规范中称作:conversational state 。对它的要求也很多的Q例如类型ؓ Serializable objects。还有,q要在ejbActivate()QejbPassivate()QejbRemove(){生命周期约定的Ҏ中处理。详见EJB规范吧?/P>
我的感想Q在看第一遍书Ӟq一Ҏ觉都没有Q根本就看不明白SessionBean中的session与Servlet容器中的session有什么区别?BR>动手~程后,才感觉到EJB只是比Servlet更规范,更重量而已。真正的区别是接口协议一个是ZHTTPQ一个是ZRMI/IIOP。Servlet与无状态的SessionBean在Session上是一L控制。Servlet中的Session对象与有状态的SessionBean是一L控制?BR>对于应用Q例如有一个购物RQ要记录正在采购的物品信息,没有EJBӞ我们一般是存在Servlet容器中的session中。有了EJBQ则可以存储在有状态的SessionBean中,q且该次有状态的sessionBean的instanceq得保存在Servlet的session中。这L好处是:臛_可以减轻Servlet容器的负载?BR>
转自:
http://zengabo.blogchina.com/blog/527365.html