??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品首页,欧美一区二区三区四区视频,久久精品日韩精品http://www.aygfsteel.com/grasszring/草之戒_zh-cnWed, 07 May 2025 05:17:06 GMTWed, 07 May 2025 05:17:06 GMT60快速、方ѝ有效的Filterhttp://www.aygfsteel.com/grasszring/archive/2010/06/10/323231.htmlAidanAidanThu, 10 Jun 2010 06:45:00 GMThttp://www.aygfsteel.com/grasszring/archive/2010/06/10/323231.htmlhttp://www.aygfsteel.com/grasszring/comments/323231.htmlhttp://www.aygfsteel.com/grasszring/archive/2010/06/10/323231.html#Feedback7http://www.aygfsteel.com/grasszring/comments/commentRss/323231.htmlhttp://www.aygfsteel.com/grasszring/services/trackbacks/323231.html       去除前后I格看似非常单的事,但是有许多h可能是因ؓq一个小问题Q折自己半天,客户端提交到所有的东西Q都是以字符串Ş式提交的Q我们不知道客户是怎么操作的,他可能把一个age属性对应的|在输入时多加了一个空|而服务器age对应的却是IntegercdQ如果你使用servletq事也好解决Q但是如果你使用的是MVC框架Q自动封装时׃得到一个类型{换异常,然而这个时候你是否有好的解军_法呢Q?br />       q里我用Filter来解册一问题Q这是最单方便有效的解决方式Q因Z不需要对每一个属性在装前都去trim()Q因是一仉怹味的事情。大安知道filter可以qo我们惌它过滤的每一个请求,在这h中有HttpServletRequest、HttpServletResponse。我们知道服务器取得客户端发送的参数都是通过HttpServletRequest来获取的Q那我们可不可以在用HttpServletRequest取值的时候就为每一个客L(fng)提交的属性去除前后空|或者其它的一些过滤操作。这肯定是可以的Q那我们先来了解一下服务器是怎么取得客户端的值的?br />
1.getParameter(name)Q返回单个倹{?br /> 2.getParameterValues(name)Q返回一个数l?br /> 3.getParameterMap()Q把客户端提交参数封装ؓ一个Mapq回。KQnameQVQvalue?br />
      当我们用servlet的时候一般都是用前两种Qstruts1使用的第2U,struts2(xwork)则用的W?U,那么我们只要在这三个Ҏ(gu)调用的时候处理前后空|那么q回到服务器的参数就又减了一分出bug的机会,看下面的实现?br />
public class RequestParameterFilter implements Filter {

    
private static Log log = LogFactory.getLog(RequestParameterFilter.class);

    
private List<String> excludeNames;

    
public void destroy() {

    }

    
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) 
throws IOException, ServletException {
        
//
        request = new HttpServletRequestWrapper2((HttpServletRequest) request);
        chain.doFilter(request, response);
    }

    
public void init(FilterConfig config) throws ServletException {
        String exclude 
= config.getInitParameter("exclude");
        
// not is null.
        if (exclude != null && exclude.length() > 0) {
            excludeNames 
= Arrays.asList(exclude.split(","));
            
if (log.isDebugEnabled()) {
                log.debug(
"initialize arguments.");
            }
        }
    }

    
/**
     * 该类l承之HttpServletRequestWrapperQƈ重写了对应取得客L(fng)相当参数值的所有的Ҏ(gu)?br />      * <ul>
     * <li>getParameter</li>
     * <li>getParameterValues</li>
     * <li>getParameterMap</li>
     * </ul>
     * 
     * 
@version 1.0/2010-6-10 上午11:25:47
     * 
@author Aidan
     * 
@see HttpServletRequestWrapper
     
*/
    
private class HttpServletRequestWrapper2 extends HttpServletRequestWrapper {

        
private ParameterMap2 pm2;

        
public HttpServletRequestWrapper2(HttpServletRequest request) {
            
super(request);
        }

        
public String getParameter(String name) {
            
if (excludeNames != null && excludeNames.contains(name)) {
                
return super.getParameter(name);
            }
            
return trim(super.getParameter(name));
        }

        @SuppressWarnings(
"unchecked")
        
public Map getParameterMap() {
            
// xwork便用此Ҏ(gu)取?br />             // 该方法返回一个MapQMap映射了客L(fng)h对应的键?K,V)?/span>
            if (pm2 == null) {
                pm2 
= new ParameterMap2(super.getParameterMap());
            }
            
return pm2;
        }

        
public String[] getParameterValues(String name) {
            
// Struts1使用此方法取得所有的参数?/span>
            if (excludeNames != null && excludeNames.contains(name)) {
                
return super.getParameterValues(name);
            }
            
return (String[]) trim(super.getParameterValues(name));
        }
    }

    
/**
     * 该此l承自HashMap?br />      * 
     * 
@version 1.0/2010-6-10 上午11:30:13
     * 
@author Aidan
     * 
@see HashMap
     
*/
    @SuppressWarnings( { 
"unchecked""serial" })
    
private class ParameterMap2 extends HashMap {

        
private Set entrySet;

        
/**
         * 若要构造此cd象,则需要传入一个map参数Q该map对应的客L(fng)h的参?K,V)?br />          * 
         * 
@param map
         *            映射客户端参数?br />          
*/
        
public ParameterMap2(Map map) {
            
super(map);
        }

        
public Set entrySet() {
            
// xwork使用了此Ҏ(gu)取?/span>
            if (entrySet == null) {
                entrySet 
= new HashSet();
                Set temSet 
= super.entrySet();
                
for (Iterator iterator = temSet.iterator(); iterator.hasNext();) {
                    Map.Entry me 
= (Map.Entry) iterator.next();
                    Entry2 entry 
= new Entry2(me);
                    entrySet.add(entry);
                }
            }
            
return entrySet;
        }

        
// 若直接从map使用key取得
        public Object get(Object key) {
            Object value 
= super.get(key);
            
// 不过滤此对象
            if (excludeNames != null && excludeNames.contains(key)) {
                
return value;
            }
            
if (value != null) {
                
return trim(value);
            }
            
return null;
        }
    }

    @SuppressWarnings(
"unchecked")
    
private class Entry2<K, V> implements Map.Entry<K, V> {
        
private Map.Entry me;
        
private boolean isTrim = true;

        
public Entry2(Map.Entry me) {
            
if (me == null) {
                
throw new IllegalArgumentException(
                        
"Map.Entiry argument not null.");
            }
            
this.me = me;
            
// 不过滤此对象
            if (excludeNames != null && excludeNames.contains(me.getKey())) {
                isTrim 
= false;
            }
        }

        
public K getKey() {
            
return (K) me.getKey();
        }

        
public V getValue() {
            
if (isTrim) {
                
return (V) trim(me.getValue());
            }
            
return (V) me.getValue();
        }

        
public V setValue(V value) {
            
return (V) me.setValue(value);
        }

    }

    
/**
     * 去除一个Objectcd对应的前后空|因ؓ客户端提交参数有两种Q一U:StringQ另一U:String[]Q此Ҏ(gu)会自动判断调用哪个方法?br />      * 
     * 
@param value
     *            需要处理的参数?br />      * 
@return 处理后的倹{?br />      */
    
protected Object trim(Object value) {
        
if (value instanceof String[]) {
            
return trim((String[]) value);
        }
        
return trim(value.toString());
    }

    
/**
     * 去除某个字符串的前后I格?br />      * 
     * 
@param value
     *            需要处理的参数?br />      * 
@return 处理后的倹{?br />      */
    
protected String trim(String value) {
        
if (value != null && value.length() > 0) {
            
return value.trim();
        }
        
return value;
    }

    
/**
     * 去除某个数组中所有的值的前后I格?br />      * 
     * 
@param values
     *            需要处理的数组?br />      * 
@return 处理后的|当数l的length?Ӟ则返回一个StringQ反之返回一个数l?br />      */
    
protected Object trim(String[] values) {
        
if (values != null && values.length > 0) {
            
int len = values.length;
            
for (int i = 0; i < len; i++) {
                values[i] 
= trim(values[i]);
            }
        }
        
if (values.length == 1) {
            
return values[0];
        }
        
return values;
    }

    
/**
     * 
     * 
@return 不处理的对象?br />      */
    
public List<String> getExcludeNames() {
        
return excludeNames;
    }

}
      q个Filter实现原理非常单,我会qo所有的hQHttpServletRequestWrapper2l承自HttpServletRequestWrapperQ在构造函C需要一个HttpServletRequest对象(q个request是webH口创徏?Q然后我重蝲了上面所说的3个方法,在方法内部每ơ会去过滤当前|q是利用了Java多态特性。在使用getParameterMap时较为麻烦,原理一栗?br />       当然我们有时候可能有些特D情况不需要过滤前后空格或者其它一些规则,q里我们可以使用exclude属性来判断是否qo此属性?br /> DEMOQ?br />
<form action="test!create.action" method="post">
            name:
            
<input name="name" value=" My name is haha.. " />
            
<br />
            
<!-- This is a String,isn't number. -->
            age:
            
<input name="age" value="   15  " />
            
<br />
            email:
            
<input name="email" value=" grasszring@gmail.com " />
            
<br />
            email2:
            
<input name="email" value=" grasszring@foxmail.com " />
            
<br />
            
<input type="submit" value=" submit " />
</form>
web.xml
<filter>
        
<filter-name>requestParameter</filter-name>
        
<filter-class>com.onlyeffort.commons.web.filter.RequestParameterFilter</filter-class>
        
<init-param>
            
<!-- 不需要过滤此参数 -->
            
<param-name>exclude</param-name>
            
<param-value>email</param-value>
        
</init-param>
    
</filter>
    
<filter-mapping>
        
<filter-name>requestParameter</filter-name>
        
<url-pattern>/*</url-pattern>
</filter-mapping>
action
@Action(params = { "actionName""test" })
@Result(location 
= "http://www.google.com", type = "redirect")
@SuppressWarnings(
"serial")
public class TestController extends ActionSupport {

    
private String name;
    
private Integer age;
    
private String[] email;
        
//.. get set method.

    @Override
    
public String create() throws CreateFailureException {
        System.out.println(name);
        System.out.println(age);
        
for (String mail : email) {
            System.out.println(mail);
        }        
        
return SUCCESS;
    }
}

      OK,如果大家有什么问题或有什么意见都管留言Q感Ȁ不尽?br />

Aidan 2010-06-10 14:45 发表评论
]]>
Struts2-疑难杂症之Validatorq回input视图http://www.aygfsteel.com/grasszring/archive/2010/06/08/323092.htmlAidanAidanTue, 08 Jun 2010 12:13:00 GMThttp://www.aygfsteel.com/grasszring/archive/2010/06/08/323092.htmlhttp://www.aygfsteel.com/grasszring/comments/323092.htmlhttp://www.aygfsteel.com/grasszring/archive/2010/06/08/323092.html#Feedback7http://www.aygfsteel.com/grasszring/comments/commentRss/323092.htmlhttp://www.aygfsteel.com/grasszring/services/trackbacks/323092.html       当然如果你是使用一个方法对一个类Q则不存在上面的问题Q当然一个方法对应一个类Q这U方式虽然可L很高但是实际开发确实不可取Q因Z会ɾcL具增加。如果你是用一个类对应多个Ҏ(gu)Q你肯定到q这样一个问题,那就是验证时q回input视图Qstruts2默认验证p|q回input视图Q但是我们在写程序中l常会有多个Ҏ(gu)需要验证,打个比方如:create、updateq两个操作一般情况下都会验证Q但是我们把它写在一个类中,我们如果区分验证p|后,到底是createp|了还是updatep|了呢Q这个时候有没有怀疑过struts2Q呵c?br />       当然struts2其时已经l了我们解决办法Q如果你是一个细心的qstruts2源码便过发现struts2是如何解决问题的Q在q里我也单的分析一下struts2的源码,大家L(fng)下面q个cR?br />
package com.opensymphony.xwork2.interceptor;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.interceptor.annotations.InputConfig;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;

import java.lang.reflect.Method;

public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {

    
private static final long serialVersionUID = 7563014655616490865L;

    
private static final Logger LOG = LoggerFactory.getLogger(DefaultWorkflowInterceptor.class);

    
private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];

    
//默认q回input视图Q是在这里定义的
    private String inputResultName = Action.INPUT;
    
    
//可以在这里更改,一般没有h会这么做
    public void setInputResultName(String inputResultName) {
        
this.inputResultName = inputResultName;
    }

    @Override
    
protected String doIntercept(ActionInvocation invocation) throws Exception {
        Object action 
= invocation.getAction();

        
if (action instanceof ValidationAware) {
            ValidationAware validationAwareAction 
= (ValidationAware) action;

            
if (validationAwareAction.hasErrors()) {
                
if (LOG.isDebugEnabled()) {
                    LOG.debug(
"Errors on action " + validationAwareAction + ", returning result name 'input'");
                }
                
//one
                String resultName = inputResultName;
                
/*
                在这里大家读一下源码即可明白,当前处理的Action如果是一个ValidationWorkflowAwarecd的,
                则调用他的getInputResultName作用q回?br />                 Z方便我直接把ValidationWorkflowAware攑֜下面的注释中Q大家看他是一个接口,
                也就是说如果我们的Action实现了ValidationWorkflowAware接口
                他则会调用getInputResultNameҎ(gu)q回的|而非inputQ而默认的ActionSupport没有实现q个接口Q我们需要手动实?br />
                
*/
                
//package com.opensymphony.xwork2.interceptor;
                
//public interface ValidationWorkflowAware {
                    
// String getInputResultName();
                
//}

                
if (action instanceof ValidationWorkflowAware) {
                    resultName 
= ((ValidationWorkflowAware) action).getInputResultName();
                }
                
//q里不做讲述
                InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), EMPTY_CLASS_ARRAY).getAnnotation(InputConfig.class);
                
if (annotation != null) {
                    
if (!annotation.methodName().equals("")) {
                        Method method 
= action.getClass().getMethod(annotation.methodName());
                        resultName 
= (String) method.invoke(action);
                    } 
else {
                        resultName 
= annotation.resultName();
                    }
                }
                
return resultName;
            }
        }

        
return invocation.invoke();
    }

}
      大家看到上面是不是已l恍然大(zhn)了Q呵呵,是的我们实现了ValidationWorkflowAware接口之后Q只需要定义一个inputResultName属性生成了对应的get、setҎ(gu)是不是就对应有了getInputResultNameQ而这个属性的值我们可以动态传入一个D来,呵呵Q大家看下面q个实例?br />

public abstract class ActionSupport extends
        com.opensymphony.xwork2.ActionSupport 
implements Result,
        ValidationWorkflowAware {

    
private static final long serialVersionUID = 799075559195465128L;

    
public static final int ERROR_MSG = -1;
    
public static final int WARN_MSG = 0;
    
public static final int SUCCESS_MSG = 1;

    
public static long getSerialversionuid() {
        
return serialVersionUID;
    }

    
private ActionContext actionContext;
    
private Object id;
    
private Pagination pagn = new Pagination();
    
private QueryResult<?> results;
    
private String inputResultName;

    
/**
     * 初始化ActionContext对象
     
*/
    
public ActionSupport() {
        actionContext 
= ActionContext.getContext();
    }

    
/**
     * 
     * 
@return ActionContext对象
     
*/
    
public ActionContext getActionContext() {
        
return actionContext;
    }

    
/**
     * 
     * 
@return Struts装后的ServletContext对象?br />      */
    
public Map<String, Object> getApplication() {
        
return actionContext.getApplication();
    }

    
/**
     * 
     * 
@return 取得标识?br />      */
    
public Object getId() {
        
return id;
    }

    
/**
     * 取得指定cd的标识?br />      * 
     * 
@param <E>
     * 
@param c
     * 
@return
     
*/
    @SuppressWarnings(
"unchecked")
    
public <E> E getId(Class<E> c) {
        
return (E) id;
    }

    
/**
     * 
     * 
@return 输出对象?br />      * @throws IOException
     
*/
    
public PrintWriter getOut() throws IOException {
        
return getResponse().getWriter();
    }

    
/**
     * 
     * 
@return 分页参数对象?br />      */
    
public Pagination getPagn() {
        
return pagn;
    }

    
/**
     * 
     * 
@return HttpServletRequest对象?br />      */
    
public HttpServletRequest getRequest() {
        
return ServletActionContext.getRequest();
    }

    
/**
     * 
     * 
@return HttpServletResponse对象?br />      */
    
public HttpServletResponse getResponse() {
        
return ServletActionContext.getResponse();
    }

    
/**
     * 
     * 
@return 查询l果集?br />      */
    
public QueryResult<?> getResults() {
        
return results;
    }

    
/**
     * 
     * 
@return ServletContext对象?br />      */
    
public ServletContext getServletContext() {
        
return (ServletContext) this.actionContext
                .get(StrutsStatics.SERVLET_CONTEXT);
    }

    
/**
     * 
     * 
@return Struts装后的HttpSession对象?br />      */
    
public Map<String, Object> getSession() {
        
return actionContext.getSession();
    }

    
/**
     * 
     * 
@return Struts的ValueStack对象?br />      */
    
public ValueStack getValueStack() {
        
return ServletActionContext.getValueStack(getRequest());
    }

    
/**
     * 向ActionContext中添加一个信息,此信息会保存到HttpServletRequest中?br />      * 
     * 
@param key
     *            键?br />      * 
@param value
     *            倹{?br />      
*/
    
public void put(String key, Object value) {
        actionContext.put(key, value);
    }

    
public void setActionContext(ActionContext actionContext) {
        
this.actionContext = actionContext;
    }

    
/**
     * 
     * 
@param id
     *            讄标识?br />      
*/
    
public void setId(Object id) {
        
this.id = id;
    }

    
/**
     * 
     * 
@param pagn
     *            讄分页参数对象?br />      
*/
    
public void setPagn(Pagination pagn) {
        
this.pagn = pagn;
    }

    
/**
     * 
     * 
@param results
     *            讄q回的结果集?br />      
*/
    
protected void setResults(QueryResult<?> results) {
        
this.results = results;
    }

    
public String getInputResultName() {
        
return inputResultName;
    }

    
public void setInputResultName(String inputResultName) {
        
this.inputResultName = inputResultName;
    }

    
public abstract String show() throws Exception;

    
public abstract String edit() throws EditFailureException;

    
public abstract String destroy() throws DestroyFailureException;

    
public abstract String create() throws CreateFailureException;

    
public abstract String deleteConfirm() throws DeleteFailureException;

    
public abstract String index() throws Exception;

    
public abstract String update() throws UpdateFailureException;

    
public abstract String editNew() throws EditFailureException;
}
      上面是我自定义一个ActionSupportc,该类实现了ValidationWorkflowAwareQƈ重写了getInputResultNameҎ(gu)。然后我再定义一个Actionl承了该cR?br />
@Namespace(value = "/test")
@Action(params 
= { "actionName""demo" })
@Results( {
        @Result(name 
= "xx", type = "redirect", location = "http://www.google.com"),
        @Result(name 
= "hello", type = "redirect", location = "http://www.baidu.com") })
@SuppressWarnings(
"serial")
public class DownloadController extends ActionSupport {

    
public String index() {
        System.out.println(
"-------index-----------");
        
return "xx";
    }

    
public void validateIndex() {
        addFieldError(
"hell"".my hello.");
        System.out.println(
"ok");
    }
    
//..省略了其它无x?/span>
}
      在上面我只是做了一个简单了模拟验证然后跌{到指定的面。这里你可以q样hQ测试一个最lstruts2是否调用了getInputResultNameҎ(gu)q用其q回|作ؓq回视图的名Uͼhttp://地址:端口/project/test/demo!index.action?inputResultName=helloQ大家测试如果蟩转到了baidup明成功了?br />       xQ有问题可以留言?br />

Aidan 2010-06-08 20:13 发表评论
]]>
Java学习(fn)W记(1)——Java~程思想(一切皆对象)http://www.aygfsteel.com/grasszring/articles/322430.htmlAidanAidanWed, 02 Jun 2010 07:24:00 GMThttp://www.aygfsteel.com/grasszring/articles/322430.htmlhttp://www.aygfsteel.com/grasszring/comments/322430.htmlhttp://www.aygfsteel.com/grasszring/articles/322430.html#Feedback0http://www.aygfsteel.com/grasszring/comments/commentRss/322430.htmlhttp://www.aygfsteel.com/grasszring/services/trackbacks/322430.html        在此ơ我的blog计划中,会把Java~程思想每一张的W记都记录在blog中,我在l常在网上看到有Java~程思想讲得有点啰嗦Q确实我L书也有这U想法,所以在我的blog中我会尽量减,只会出现有关Java和内容,会把作者描q的C/C++Ҏ(gu)斚w省略掉,当然q只是做一个参考,大家一定要d?fn)完整的Java~程思想?br />

1.用引用操U对?/h3>        Java中一切都视ؓ对象Q但实际操作对象是一?#8220;引用”(reference)标识W?br /> q就如果Q遥控器(引用)操作?sh)?对象)一P我们拿着遥控器就能与?sh)视Z持连接。如果想要调整音量大或者更换频道时Q我们实际上是操作的遥控器,再由控制器调控电(sh)视机。我们可以带着控制器在戉K四处走动Q同样也可以操作?sh)视机?br /> 控制器和?sh)视机是同时可以单独存在的,没有电(sh)视机,遥控器也可单独存在?br />
String s;
在上面我们创Z一个String的引用,但它只是一样引用,q未与Q何一个对象相兌Q如果你试向s发送消息,则会得到一个运行时异常Q所以一U安全的做法是,在我们创Z个引用同时便行初始化?br />
String s = "init";
上面的String是Java中的一U特D类型,所以可以直接用带引号的文本进行初始化Q通常Q必dJava中的对象采用一U更通用的初始化Ҏ(gu)?br />

2.必须p己创建所有的对象

       通常我们使用new操作W来创徏一个对象?br />
String s = new String("init");
上面是创Z个String对象同时初始化ƈ把该对象的引用赋值给sQ此时s便是一个对象的引用(sq是一个对象,只是一个引??br />

2.1.存储位置

       Java中有5个不同的数据存储区:
       1).寄存器:它位于处理器内部是最快的存储区。但寄存器极其有限,它是Ҏ(gu)需求进行分配,我们不能直接操作也不能在E序中感觉到它的存在?br />        2).堆栈Q?/strong>位于通用RAM(随机讉K存储?中通过堆栈指针可以处理器哪里操作堆栈。指针向下移动则分配新的内存Q若向上Ud则释N些内存,速度公次于存储器Q但Java必须知道存储在堆栈内所有项的确切生命周期,以便上下Ud指针。这限制了程序的灉|性,所以只有某些Java数据存储于堆栈中(对象的引?QJava对象q不存放于其中?br />        3).堆:通用的内存池Q用于存放所有的Java对象。存储在堆里的数据编译器不需要知道存?gu)zd长时间。当使用new创徏一个对象时Q会自动在堆里存储分配。ؓ了这U灵zL也牺牲更多的时间?br />        4).帔R存储Q?/strong>帔R通过直接存放于代码的内部Q因Z们永q不会被改变?br />        5).非RAM存储Q?/strong>该存储于E序之外Q即使程序停止依然保持自q状态如(对象,持久化对?。对象{化ؓ字节,发送给另一台机器,“持久化对?#8221;卛_象被存储于磁盘或者其他媒介上Q在需要时可恢复常规对象?br />

2.2.基本数据cd

       在Java中经常用到这样一pdҎ(gu)对象?#8220;基本cd”Qnew创徏对象会存储在“?#8221;里,如果是一些特别小的、简单的cdQ往往不是那么有效Q在Java中提供一些不需要用new创徏变量Q而是创徏一?span style="color: red;">q引用?#8220;自动”变量。这个变量直接存?#8220;?#8221;q存放于堆栈中?br />        Java中的所有基本类型所占的存储I间大小是固定的Q不会因为硬件架构变化而变化?br />       

3.W一个JavaE序

package com.onlyeffort.java.concurrency;

// 可替换ؓQimport java.util.*;
import java.util.Random;

//定义一个公q名ؓQHelloWorld
public class HelloWorld {
    
// mainҎ(gu)Q程序的入口Q结构不可变Q主体可?/span>
    public static void main(String[] args) {
        
// body start..大括号开?br />         // 创徏一个对?/span>
        HelloWorld hw = new HelloWorld();
        
// 使用hw引用调用sayҎ(gu)
        System.out.println(hw.say());
        
// body end..大括L(fng)?/span>
    }
    
/**
     * 
     * 
@return q回一个字W串,q打出出?
     
*/
    
public String say() {
        Random rand 
= new Random();
        
return "Hello,World!" + rand.nextInt();
    }
}
      W一行ؓ包声明语句,包名全ؓ写Q一般ؓ域名的反转Ş式,防止出现冲突Q因为域名在全球是唯一的?br />       当我们需要用其它公qcȝ件时需要用import语句引入cR但java~译器在每个Java文g~译时会自动引用java.lang.*;下面的所有类Q只是lang包下面的所有,但ƈ不包含lang下面的子包,如果我们需要用java.lang.reflect.Array;Ӟq需要我们手动引用?br />       mainҎ(gu)是Javaq行时程序的入口Q结构单一不可改变。在mainҎ(gu)中我们创Z一个HelloWorld对象Qƈ把它赋值给hwQ此时hw是一个HelloWorld对象的一个引用,hwq是一个对象。在后面我们调用了HelloWorld的sayҎ(gu)Q此Ҏ(gu)q回一个字W串Q在sayҎ(gu)中,我们创徏了一个随机数Qƈ把它与一个字W串相连接。rand.nextInt()Ҏ(gu)会返回一个intcd的整敎ͼq里Java~译器会执行cd转换Q把intcd转换为Stringcdq执行字W串q接。在最后我们用了return语句q回q个Ҏ(gu)的返回倹{?br />       return在JavaE序中有两种作用Q一Q会l束当前Ҏ(gu)(return;);二:q回某个Ҏ(gu)的返回?return value;)?br />       在这个HelloWorld中出C“//”?#8220;/***/”q都是Java当中的注释。Java~译器编译时会忽略注释后面的所有内宏V?br />


Aidan 2010-06-02 15:24 发表评论
]]>
վ֩ģ壺 | Խ| г| | | ˶| ǰ| | | ɽ| Ϊ| غ| ¡| | | | | | ״| ׶| ʵ| | | | ¡| ͩ| | ˴| | ѳ| | ̫| | | | | | | | | ɽ|