快乐彩12选5走势图:BlogJava - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/相信自己的人生有无限可能,把握每一个机会,全力以赴……zh-cnSat, 15 Dec 2018 20:19:23 GMTSat, 15 Dec 2018 20:19:23 GMT60Java可变参数方法重载时要注意的几个问题 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2010/04/18/318698.html心梦帆影心梦帆影Sun, 18 Apr 2010 15:59:00 GMT//www.ot7t.com.cn/rongxh7/archive/2010/04/18/318698.html//www.ot7t.com.cn/rongxh7/comments/318698.html//www.ot7t.com.cn/rongxh7/archive/2010/04/18/318698.html#Feedback0//www.ot7t.com.cn/rongxh7/comments/commentRss/318698.html//www.ot7t.com.cn/rongxh7/services/trackbacks/318698.htmlJDK1.5引进了方法的可变参数,受到许多开发人员的青睐。有了这种机制,我们可以写出类似于JavaScript的arguments那样的带任意多个参数的方法。Java的可变参数,可用于普通方法上,也可以用于构造方法上,大大增大了我们所写方法的适用范围。


然而,使用可变参数时,要注意几个问题:

 

1) 可变参数方法与数组参数方法重载时

 

public class MethodParams{
//带可变参数的方法
public void hello(String ...params) {
System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
}
//带数组参数的方法
public void hello(String[] params) {
System.out.println("执行带数组参数的方法,数组长度为:" + params.length);
}
}

我们写个测试代码运行一下看看结果如何:

	MethodParams mp = new MethodParams();
mp.hello("AAA","BBB","CCC");

  编译时报错:

MethodParams.java:7: 无法在 MethodParams 中同时声明 hello(java.lang.String[]) 和
hello(java.lang.String...)
public void hello(String[] params) {
^
1 错误

结论: JDK不允许存在, 带可变参数的方法和带数组参数的方法在同一类中重载。

可变参数==数组参数? 在带可变参数的方法体时,读取可变参数列表时,就是以数组的方式来读??;

带可变参数的方法可以传入一个数组参数,但带数组参数的方法却不能传入可变参数。

 

 

2) 可变参数方法与可变参数方法重载时

	//带可变参数的方法
public void hello(String ...params) {
System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
}
//带固定参数和可变参数
public void hello(String param1, String ...params) {
System.out.println("执行带固定参数和可变参数的方法,参数个数为:" + params.length);
}

  测试代码跟上例中一样,编译时报错:

MethodParams.java:18: 对 hello 的引用不明确,MethodParams 中的 方法 hello(java.l
ang.String...) 和 MethodParams 中的 方法 hello(java.lang.String,java.lang.String
...) 都匹配
mp.hello("AAA","BBB","CCC");
^
1 错误

 结论:JDK不允许存在,带相同参数类型列表(Type List)的参数列表的方法在同一类中重载。

 

 

3)可变参数方法与无参数方法重载时

	//带可变参数的方法
public void hello(String ...params) {
System.out.println("执行带可变参数的方法,参数个数为:" + params.length);
}
//不带参数的方法
public void hello() {
System.out.println("执行不带参数的方法");
}

我们都知道,可变参数即可带0个或者多个参数,如果带0个参数即不带参数时,JDK会怎么处理呢?

那我们就以执行"mp.hello()"来测试一下。编译通过,运行正常,调用的还带参数的hello()方法。

结论:当可变参数方法与不带参数的方法重载时,JDK默认调用的是无参数的方法。若类中没有定义无参数的方法,则会调用可变参数的方法。



心梦帆影 2010-04-18 23:59 发表评论
]]>
Java的代理模式(通过公共接口实现) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2010/03/31/317070.html心梦帆影心梦帆影Wed, 31 Mar 2010 08:00:00 GMT//www.ot7t.com.cn/rongxh7/archive/2010/03/31/317070.html//www.ot7t.com.cn/rongxh7/comments/317070.html//www.ot7t.com.cn/rongxh7/archive/2010/03/31/317070.html#Feedback2//www.ot7t.com.cn/rongxh7/comments/commentRss/317070.html//www.ot7t.com.cn/rongxh7/services/trackbacks/317070.html
/**
 * 代理子类和目标子类的公共接口
 * 
@author rongxinhua
 *
 
*/
public interface MyInterface {
    
    
public void doOperation();

}

/**
 * 目标子类
 * 
@author rongxinhua
 *
 
*/
public class RealClass implements MyInterface {

    
/**
     * 我们要执行的目标方法
     
*/
    @Override
    
public void doOperation() {
        System.out.println(
"doOperation");
    }

}

而在没有使用代理模式的情况下,我们是这样执行目标方法的:
        RealClass realObj = new RealClass();
        realObj.doOperation();    
//调用目标方法
打印时输出:
doOperation


而我们要加入额外的处理的话,就可以使用代理类了:
/**
 * 代理子类
 * 
@author rongxinhua
 *
 
*/
public class ProxyClass implements MyInterface {

    
private MyInterface realObj;    //目标子类对象
    
    
public ProxyClass(MyInterface realObj) {
        
this.realObj = realObj;
    }
    
    
/**
     * 调用目标子类的方法,并在其中加入了前置处理和后置处理
     
*/
    @Override
    
public void doOperation() {
        doBefore();
        realObj.doOperation();
        doAfter();
    }
    
    
/**
     * 目标方法调用前的相关处理
     
*/
    
private void doBefore() {
        System.out.println(
"doBefore");
    }
    
    
/**
     * 目标方法调用后的相关处理
     
*/
    
private void doAfter() {
        System.out.println(
"doAfter");
    }

}

有了代理类,我们可以这样执行目标方法:
        ProxyClass proxyObj = new ProxyClass(new RealClass());
        proxyObj.doOperation();    
//通过代理对象调用doOperation方法

打印时输出:
doBefore
doOperation
doAfter

本文只是代理模式的在Java中的简单使用,而代理模式与Java反射机制的整合,为Java组件开发增加了强大的生命力,有兴趣的朋友可看我另一个博客中的文章:探讨代理模式与Java反射机制的应用。



心梦帆影 2010-03-31 16:00 发表评论
]]>
舍友笔试中的一道算法题(我的解法) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2010/03/23/316228.html心梦帆影心梦帆影Mon, 22 Mar 2010 18:04:00 GMT//www.ot7t.com.cn/rongxh7/archive/2010/03/23/316228.html//www.ot7t.com.cn/rongxh7/comments/316228.html//www.ot7t.com.cn/rongxh7/archive/2010/03/23/316228.html#Feedback8//www.ot7t.com.cn/rongxh7/comments/commentRss/316228.html//www.ot7t.com.cn/rongxh7/services/trackbacks/316228.html
题目大意:输入一个字符串,显示出字符串的所有排列。例如:输入"abc",就得输出"abc"、"acb"、"bac"、"bca"、"cab"、"cba" 所有可能的序列。

颇有意义的一道题,我决定用Java语言来写一写。代码如下:
import java.util.Arrays;
public class CharList {

    
//遍历所有可能的排列结果
    public static void traversal(char[] chss, int index){
        
//for循环,从index位置开始向前(向右), index位置的数与i位置的数互换
        for(int i = index; i < chss.length; i ++) {
            
char[] chs = Arrays.copyOf(chss, chss.length);    //Copy出新数组(为了修改其值时互不影响)
            char temp = chs[index];
            chs[index] 
= chs[i];
            chs[i] 
= temp;
            
if(index == chs.length-1) {    //到了字符串末, 输出结果
                System.out.println(new String(chs));
                
break;    //跟出此次循环, 此traversal方法执行完毕,跳回上一级循环(在上一个方法体中)
            }
            traversal(chs, index
+1);        //递归
        }
    }

    
//Test
    public static void main(String[] args) {
        String str 
= "abcd";
        
char[] chs = str.toCharArray();    //转成字符数组
        traversal(chs, 0);
    }

}

程序执行,输出结果为:
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc


心梦帆影 2010-03-23 02:04 发表评论
]]>
18位身份证验证小组件idchecker发布 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2010/01/03/308097.html心梦帆影心梦帆影Sun, 03 Jan 2010 10:43:00 GMT//www.ot7t.com.cn/rongxh7/archive/2010/01/03/308097.html//www.ot7t.com.cn/rongxh7/comments/308097.html//www.ot7t.com.cn/rongxh7/archive/2010/01/03/308097.html#Feedback2//www.ot7t.com.cn/rongxh7/comments/commentRss/308097.html//www.ot7t.com.cn/rongxh7/services/trackbacks/308097.html下载地址://codeshop.googlecode.com/files/idchecker.zip

提供给外部调用的cn.idchecker.check.Checker类的相关方法如下表:

方法 方法作用 参数及返回值
Checker(String num) 构造方法 参数num为18位身份证号码的字符串
boolean checkLength() 验证身份证长度是否正确 长度为18,则返回true,否则返回false
boolean checkBirth() 验证出生生日码是否合法 合法则返回true,否则返回false
boolean checkAddr() 验证地址码是否存在 存在则返回true,否则返回false
boolean checkCheckCode() 计算校验码是否正确 正确则返回true,否则返回false
boolean check() 总的身份证验证,验证顺序:长度 -> 生日 -> 最后一位校验码 -> 地址 若遇到有一项目不合法即返回false,所有验证通过才返回true。验证后,可通过调用getErrorMsg()方法获取错误信息
boolean checkAll() 总的身份证验证,验证项目包括长度、地址、生日、最后一位校验码 身份证合法则返回true,否则false。验证后,可调用getErrorMsgs()方法获取错误信息集合
String getBirth() 获取出生年月日 返回“2010年01月12日”格式的生日字符串通串
String getAddr() 获取公民籍贯 返回籍贯字符串("xx省xx市xx县”)
String getSex() 获取性别 返回“男”或“女”
String getErrorMsg() 获取错误信息 返回错误信息字符串
public Set<String> getErrorMsgs() 获取错误信息集合 返回错误信息集合

用法举例 1 :解压缩“idchecker.zip”,将其目录下的“idchecker.jar” 包引进Java Project中,以下是测试程序:

public class TestChecker { 

    
public static void main(String[] args) {
        Checker checker 
= new Checker("44010619860710145X");
        System.out.println(
"出生年月日  : " + checker.getBirth());
        System.out.println(
"性别  :" + checker.getSex());
        System.out.println(
"居民地址  : " + checker.getAddr());
        System.out.println(
"身份证号码是否合法 : " + checker.check() + "  " + checker.getErrorMsg());
        checker.checkAll();    
        
for(String msg : checker.getErrorMsgs()) {
            System.out.print(msg 
+ " | ");
        }
    } 

}


运行结果:

出生年月日  : 1986年07月10日
性别  :男
居民地址  : 广东省广州市天河区 
身份证号码是否合法 : true  


用法举例 2 :将“idchecker.jar” 包引进到Web Project的lib目录下,以下是测试程序:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>测试idchecker组件</title>
</head>
<body>
<h1>身份证验证</h1>
<%
    
String id = request.getParameter("ID");
    
if(id != null && !"".equals(id.trim())){
        cn.idchecker.check.Checker checker 
= new cn.idchecker.check.Checker(id);
        
if(checker.check()) {
            out.print(checker.getSex() 
+ "<br/>");
            out.print(checker.getBirth() 
+ "<br/>");
            out.print(checker.getAddr());
        } 
else {
            out.print(
"身份证不合法!" + "<br/>");
            out.print(checker.getErrorMsg());
        }
    } 

%>
<form action="input.jsp" method="post">
    身份证号码 :
<input name="ID" type="text" value="<%=id %>"/>&nbsp;&nbsp;
    
<input type="submit" value="验证"/>
</form>
</body>
</html>
 


运行结果:

 image image



心梦帆影 2010-01-03 18:43 发表评论
]]>
写个观察者模式(Observer Pattern)的例子 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/12/20/306737.html心梦帆影心梦帆影Sun, 20 Dec 2009 11:37:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/12/20/306737.html//www.ot7t.com.cn/rongxh7/comments/306737.html//www.ot7t.com.cn/rongxh7/archive/2009/12/20/306737.html#Feedback3//www.ot7t.com.cn/rongxh7/comments/commentRss/306737.html//www.ot7t.com.cn/rongxh7/services/trackbacks/306737.html阅读全文

心梦帆影 2009-12-20 19:37 发表评论
]]>
DIV+CSS布局中自适应高度和宽度 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305828.html心梦帆影心梦帆影Sun, 13 Dec 2009 18:19:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305828.html//www.ot7t.com.cn/rongxh7/comments/305828.html//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305828.html#Feedback7//www.ot7t.com.cn/rongxh7/comments/commentRss/305828.html//www.ot7t.com.cn/rongxh7/services/trackbacks/305828.htmlDIV+CSS布局,应用越来越普遍,小的个人主页、大的门户网站,很多都采用了DIV+CSS布局。在设计过程中,有时会遇到一些问题,要注意一下。且看下面的网页截图:

未命名

从截图中, 我们可看出,

问题1:右边的内容多时,会导致左边露空白;或者左边内容多时,会导致右边露空白。怎么解决?

问题2:右边那一大块层的宽度应该设置多少呢?设置小了,会与右边界不对齐,设置大了,整块层会被挤到下一行去。怎么办?

其实,两个问题,都可归结到同一个问题,即如何使得层的高度或宽度达到自适应的效果?

且看下面的HTML和CSS代码,详细讲解在CSS代码注释中:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"//www.w3.org/TR/html4/loose.dtd"
>
<html xmlns="//www.w3.org/1999/xhtml">
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        
<title>New Web Project</title>
        
<link rel="stylesheet" type="text/css" href="index.css" />
    
</head>
    
<body>
        
<div id="container">
            
<div id="header"></div>
            
<div id="middleBody">
                
<div id="sider" class="column">
                    
<p>心梦帆影</p>
                    
<p>心梦帆影</p>
                
</div>
                
<div id="content" class="column">
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>
                    
<p>//www.ot7t.com.cn/rongxh7</p>                    
                
</div>
            
</div>
            
<div id="footer"></div>
        
</div>
    
</body>
</html>


body {
    margin-top
:0px;    /* 去除网页上边空白 */
}
/* 大容器,包含下面所有层 */
#container 
{
    width
:800px;
    margin
:0px auto;    /* 居中 */
}
/* 头部 */
#header 
{
    width
:100%;
    height
:100px;
    background
:#FFE1FF;
}
/* 中部,包括左边区(sider)和右边内容区(content) */
#middleBody 
{
    width
:100%;
    overflow
:hidden;    /* 隐藏超出的部分 */
}
/* 左边 */
#sider 
{
    width
:200px;
    float
:left;
    background
:#FFE4E1;
}
/* 右边主内容区 */
#content 
{
    
/* 此两行是#content自适应宽度的关键,旨在与右边界对齐,且不被挤到下面去 */
    padding-right
:10000px;
    margin-right
:-10000px;
    float
:left;
    background
:#FFFAF0;
}
/* #sider和#content共同属性,此为自适应高度的关键,旨在#sider和#content下边界对齐,且不会露白*/
.column 
{
    padding-bottom
:20000px;
    margin-bottom
:-20000px;
}
/* 底部 */
#footer
{
    clear
:left;    /* 防止float:left对footer的影响 */
    width
:100%;
    height
:80px;
    background
:#FFE4B5;
}

运行截图如下:

image



心梦帆影 2009-12-14 02:19 发表评论
]]>
Div+CSS布局的宽度计算及在各浏览器中的差异比较 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305827.html心梦帆影心梦帆影Sun, 13 Dec 2009 16:39:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305827.html//www.ot7t.com.cn/rongxh7/comments/305827.html//www.ot7t.com.cn/rongxh7/archive/2009/12/14/305827.html#Feedback1//www.ot7t.com.cn/rongxh7/comments/commentRss/305827.html//www.ot7t.com.cn/rongxh7/services/trackbacks/305827.html对比于传统的表格布局和框架布局,DIV+CSS布局有着布局容易、改版方便、样式定义灵活、HTML代码简洁清晰、易于JavaScript操控等优点。在众口皆碑的同时,对于一些初学者,总会遇到各种各样的问题,比如说DIV的宽度或高度的计算问题。

我们来探讨一下影响DIV宽度或高度的属性有哪些?

DIV的宽度 = width + padding + border + margin

仅从一条公式上看,可能有点难理解,我们通过测试代码和截图来观察一下。为了测试结果观察直观,我们只测试一边,即左边,即本来padding、border、margin的宽度计算,都是左右两边都算在内的,这里就只测试左边,右边同理。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml">
    
<head>
        
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        
<title>测试DIV的宽度</title>
        
<style type="text/css">
            #container 
{
                
/* 左参考线 */
                border-left
:1px solid #B23AEE;
            
}
            
/* 定义各个层的公共属性 */
            #div1,#div2,#div3,#div4
{
                width
:200px;
                height
:50px;
                background
:#FFE1FF;
                margin-bottom
:5px;
            
}
            
/* 只有width */
            #div1
{
            
}
            
/* 加上border */
            #div2
{
                border-left
:10px solid red;
            
}
            
/* 加上border和padding */
            #div3
{
                border-left
:10px solid red;
                padding-left
:50px;
            
}
            
/* 加上border、padding和margin */
            #div4
{
                border-left
:10px solid red;
                padding-left
:50px;
                margin-left
:50px;
            
}
        
</style>
    
</head>
    
<body>
        
<div id="container">
            
<div id="div1">
                心梦帆影心梦帆影心梦帆影心梦帆影心梦帆影
            
</div>
            
<div id="div2">
                心梦帆影心梦帆影心梦帆影心梦帆影心梦帆影
            
</div>
            
<div id="div3">
                心梦帆影心梦帆影心梦帆影心梦帆影心梦帆影
            
</div>
            
<div id="div4">
                心梦帆影心梦帆影心梦帆影心梦帆影心梦帆影
            
</div>
        
</div>
    
</body>
</html>

我们在Firefox中测试,截图如下:

image

我们来分析一下DIV4,如下图:

image

对照上面的代码和截图,我们可以清楚地理解“div的宽度 = width + padding + border + margin”这条公式。

对于Web前端开发者来说,最头痛的事情就是因浏览器的差异而引起的网页显示效果的差异,而对于这条宽度计算公式,在其他浏览器中会不会有不兼容的问题呢?

幸好,大部分常用的浏览器,我机器上都安装了,测试结果是:在Firefox、Opera、Google、IE8、IE7显示都跟上面的截图一样,也就是说,在这些浏览器中,宽度的计算公式是:

DIV的宽度 = width + padding + border + margin

 

而在IE6中测试,结果却不是这样,请看运行截图:

image

由上图可以看出,在IE6的宽度计算是:

DIV的宽度 = width + margin

而border和padding,是占用了width的位置。这一点,在前端开发中要注意。



心梦帆影 2009-12-14 00:39 发表评论
]]>
原创一道Java笔试面试题考考大家 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/11/28/303990.html心梦帆影心梦帆影Fri, 27 Nov 2009 19:21:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/11/28/303990.html//www.ot7t.com.cn/rongxh7/comments/303990.html//www.ot7t.com.cn/rongxh7/archive/2009/11/28/303990.html#Feedback24//www.ot7t.com.cn/rongxh7/comments/commentRss/303990.html//www.ot7t.com.cn/rongxh7/services/trackbacks/303990.html 以下代码有些朋友可能会似曾熟识,可能也算不上“原创”,请见谅!
不过,我出的这题,确定有点意思,考考大家。
/**
 * 父类
 * 
@author rongxinhua
 *
 
*/
public class Father{
    
private String name="FATHER";
    
public Father(){
        whoAmI();
        tellName(name);
    }
    
public void whoAmI(){
        System.out.println(
"Father says, I am " + name);
    }
    
public void tellName(String name){
        System.out.println(
"Father's name is " + name);
    }
}

/**
 * 子类
 * 
@author rongxinhua
 *
 
*/
public class Son extends Father{
    
private String name="SON";
    
public Son(){
        whoAmI();
        tellName(name);
    }
    
public void whoAmI(){
        System.out.println(
"Son says, I am " + name);
    }
    
public void tellName(String name){
        System.out.println(
"Son's name is " + name);
    }
}

问题:当执行 Father who = new Son(); 时,会输出什么?
如果你去参加一个公司的笔试或面试时问了这么一道题,在没有环境测试的情况下,你会猜测什么答案?



心梦帆影 2009-11-28 03:21 发表评论
]]>
CSS的position:fixed的使用 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/11/22/303225.html心梦帆影心梦帆影Sun, 22 Nov 2009 06:58:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/11/22/303225.html//www.ot7t.com.cn/rongxh7/comments/303225.html//www.ot7t.com.cn/rongxh7/archive/2009/11/22/303225.html#Feedback25//www.ot7t.com.cn/rongxh7/comments/commentRss/303225.html//www.ot7t.com.cn/rongxh7/services/trackbacks/303225.html接触CSS已有相当长一段时间,我们竟然没有留意position:fixed的用法。

我们都知道CSS中定位属性position的值,除了默认的值外,还有absolute,relative和fixed。我平时比较常用absolute和relative,而position:fixed却没多关注?;蛐硎且蛭背踉贑SS中文手册中看到position:fixed旁边有说明“IE5.5及NS6尚不支持此属性”吧。

前段时间,在做一个项目时需要使一个层相对于浏览器边框固定,那时用position:absolute试了下,发觉absolute是对网页边框而言的。后来,上网查了一些根据滚动条的移动,动态地改变left和top的值的JavaScript语句,虽然能实现了类似的效果,但滚动条移动时,那个层晃来晃去的,感觉不好看,想要一种能使层固定不动的做法。

且看下面的代码:

<style type="text/css">
<!--
#help{
    width:30px;
    height:20px;
    background-color:green;
    position:fixed;
    left:60px;
    top:100px;
}
-->
</style>

我们用上面这段代码来定义页面上的一个层“help”(id=“help”)。这样就能实现我们想要的效果了。

在IE8、Firefox、Opera、Google等浏览器中测试,都没有问题,唯独低版本的IE中,这个属性无效。



心梦帆影 2009-11-22 14:58 发表评论
]]>
Struts 2.1.6 精简实例系列教程(6):重写用户登录??椋ㄕ螶query+JSON) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/08/14/291207.html心梦帆影心梦帆影Fri, 14 Aug 2009 14:32:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/08/14/291207.html//www.ot7t.com.cn/rongxh7/comments/291207.html//www.ot7t.com.cn/rongxh7/archive/2009/08/14/291207.html#Feedback10//www.ot7t.com.cn/rongxh7/comments/commentRss/291207.html//www.ot7t.com.cn/rongxh7/services/trackbacks/291207.html阅读全文

心梦帆影 2009-08-14 22:32 发表评论
]]>
Struts 2.1.6 精简实例系列教程(5):用户注册??椋ㄕ螶query) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/08/01/289402.html心梦帆影心梦帆影Sat, 01 Aug 2009 08:16:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/08/01/289402.html//www.ot7t.com.cn/rongxh7/comments/289402.html//www.ot7t.com.cn/rongxh7/archive/2009/08/01/289402.html#Feedback11//www.ot7t.com.cn/rongxh7/comments/commentRss/289402.html//www.ot7t.com.cn/rongxh7/services/trackbacks/289402.html阅读全文

心梦帆影 2009-08-01 16:16 发表评论
]]>
Struts 2.1.6 精简实例系列教程(4):新闻管理??榈氖迪?- ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/27/288495.html心梦帆影心梦帆影Sun, 26 Jul 2009 17:14:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/27/288495.html//www.ot7t.com.cn/rongxh7/comments/288495.html//www.ot7t.com.cn/rongxh7/archive/2009/07/27/288495.html#Feedback2//www.ot7t.com.cn/rongxh7/comments/commentRss/288495.html//www.ot7t.com.cn/rongxh7/services/trackbacks/288495.html阅读全文

心梦帆影 2009-07-27 01:14 发表评论
]]>
Struts 2.1.6 精简实例系列教程(3):新闻管理Model层的开发(整合iBatis) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/26/288414.html心梦帆影心梦帆影Sat, 25 Jul 2009 19:02:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/26/288414.html//www.ot7t.com.cn/rongxh7/comments/288414.html//www.ot7t.com.cn/rongxh7/archive/2009/07/26/288414.html#Feedback9//www.ot7t.com.cn/rongxh7/comments/commentRss/288414.html//www.ot7t.com.cn/rongxh7/services/trackbacks/288414.html阅读全文

心梦帆影 2009-07-26 03:02 发表评论
]]>
Struts 2.1.6 精简实例系列教程(2):用户登录??榈氖迪?- ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/21/287554.html心梦帆影心梦帆影Mon, 20 Jul 2009 16:14:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/21/287554.html//www.ot7t.com.cn/rongxh7/comments/287554.html//www.ot7t.com.cn/rongxh7/archive/2009/07/21/287554.html#Feedback2//www.ot7t.com.cn/rongxh7/comments/commentRss/287554.html//www.ot7t.com.cn/rongxh7/services/trackbacks/287554.html用户登录几乎是每一个Web系统的必需???,本期教程就通过用户登录??槔唇步釹truts2.1.6的Action和Result的Annotation配置。

上期的Struts 2.1.6 精简实例系列教程(1):环境的搭建与HelloSimple中,我们建的package名为“cn.simple.action”,这些包名有一个规则的,只要包含“action,actions,struts,struts2”都会默认被扫描到为Action类,也就是说,我们只要配置了如“cn.simple.action”、“cn.simple.struts”、“cn.simple.action.admin”等包名,就可以不用在配置文件struts.xml(Struts2.0的配置文件)中配置这些Action类了。当然,这些包名,也可以是别的,但要写一点点配置,我们就用默认的吧。关于这方面的详细说明,还是强烈建议大家先看官方的文档//struts.apache.org/2.1.6/docs/convention-plugin.html。

好,我们开始写我们的用户登录??榘?。先写个loginform.jsp,记得,不要忘记我们把JSP文件放在Web-Inf/content/目录下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页</title>
</head>
<body>

<s:fielderror></s:fielderror>

<form action="login.action" method="post">
    账号<input type="text" name="loginName" value="${loginName}"/><br/>
    密码<input type="password" name="password"><br/>
    <input type="submit" value="登录"/>
</form>

</body>
</html>

大家如果想用Struts 2的标签库的话,也可以用Struts 2的Form标签,用之前,要在JSP头配置上Struts 2标签库,换成Struts 2标签的版本后,即:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<s:fielderror></s:fielderror>

<s:form action="login">
    <s:textfield name="loginName"></s:textfield>
    <s:password name="password"></s:password>
    <s:submit value="登录"></s:submit>
</s:form>

</body>
</html>

接着,我们写一个登录处理的Action类:loginAction.java,代码如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;

@Results({
    @Result(name="success", location="admin/index.action", type="redirect"),
    @Result(name="input", location="loginform.jsp", type="dispatcher")
})

public class LoginAction extends ActionSupport {

    private String loginName;
    private String password;
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    @Override
    public void validate() {
        if( ! "simple".equals(loginName)){
            addFieldError("loginName", "登录名不正确!");
        }else if(! "simple".equals(password)){
            addFieldError("password", "密码不正确!");
        }
    }

    //*******Getter和Setter方法***********//
    public String getLoginName() {
        return loginName;
    }
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

解释一下这个类吧:

execute 这个方法是重写了父类ActionSupport的方法,是Action默认会执行的方法,即访问…/login.action或者…/login,它默认会执行这个方法。

validate 在执行execute方法之前,它会先执行validate这个方法,检查登录框是否输入正确,这个方法也是重写了父类的validate方法。

getter和setter,有了setter方法,才能使action能拿到上一个JSP页面传过来的Request域的数据;有了getter方法,下一个转发(dispatcher)过去的页面才能拿到此Action的Request域的数据。

执行过程是这样:表单提交给LoginAction,LoginAction先执行validate方法,检验loginName和password是否符合要求,如果不符合,就会addFieldError (把错误信息放到Field栈里),如果Field栈里有错误信息的话,它就不会再执行execute方法,直接转发(Dispatcher)到INPUT即“input”所指定的错误处理页面,这里为location="loginform.jsp",即让它返回到表单登录页去,如果刚才validate方法中验证正确,即Field栈中没有错误信息,就会执行execute方法。在这里execute返回SUCCESS,即“success”,根据Result注解,就会重定向到admin/index.action这个action。

返回SUCCESS重定向到的后台主页,其实简单,admin/index.jsp,代码很简单,就在HTML中显示一句“登录成功”,代码略。

这些的目录结构如下:

image

运行一下吧:

image

image

image

一点提醒:本项目网页的排版以精简为主,在真实的网站开发中,建议用Dreamweaver可视化排版,再作必要的修改和嵌入必要的动态标签。

“Struts 2.1.6 精简实例系列教程(2):用户登录??榈氖迪帧?讲解就到此,你也试一下吧,好,敬请关注下文!



心梦帆影 2009-07-21 00:14 发表评论
]]>
Struts 2.1.6 精简实例系列教程(1):环境的搭建与HelloSimple - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/18/287258.html心梦帆影心梦帆影Sat, 18 Jul 2009 09:27:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/18/287258.html//www.ot7t.com.cn/rongxh7/comments/287258.html//www.ot7t.com.cn/rongxh7/archive/2009/07/18/287258.html#Feedback10//www.ot7t.com.cn/rongxh7/comments/commentRss/287258.html//www.ot7t.com.cn/rongxh7/services/trackbacks/287258.html下载Struts2.1.6,网址//struts.apache.org/download.cgi#struts216,点击下图中选中的部分即可下载。

image

下载Eclipse for JavaEE(3.4 or 3.5),网址//www.eclipse.org/downloads/,点击下图选中的链接,进入下一个页面,找到能够下载的地方下载就行。

image

JDK6.0和Tomcat6.0,请大家自行下载。

另外,建议下载JSP标准标准库JSTL,下载地址:/Files/rongxh7/jstl-jar.rar

好,暂时下载这些,以后,需要用到其他的时,再下载。至于JDK6.0,Tomcat6.0,Eclipse的安装,请大家自行安装,在这里就不演示安装过程了,如有什么问题,再联系我。

关于Eclipse的部分用法,如在Eclipse里配置Tomcat服务器,新建动态Web项目等,请看我的(Eclipse图解教程),或者上网找一下其他的资料学习一下。

来开始我们的项目吧,先做个简单的测试,New一个Dynamic Web Project,起名为“SimpleWeb”,将Struts2.1.6的下载包解压后得到的lib目录,在lib目录下,找到以面的jar包:

xwork-2.1.2.jar
struts2-core-2.1.6.jar
struts2-convention-plugin-2.1.6.jar
ognl-2.6.11.jar
freemarker-2.3.13.jar
commons-loggin-1.0.4.jar
commons-fileupload-1.2.1.jar

把这些包放进项目的lib目录下,同时,建议也把JSTL的核心jar包也放到lib目录,这些JSTL的包主要有:

jstl.jar
standard.jar

我们先要在项目WEB-INF下的web.xml文件中配置Struts2应用,配置后,web.xml全部代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns="//java.sun.com/xml/ns/javaee" xmlns:web="//java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="//java.sun.com/xml/ns/javaee //java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SimpleWeb</display-name>
  <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

我们在项目的WEB-INF目录下新建一个文件夹命名为“content”,这个文件夹名一定要这样,如果写成别的,要另外配置一下,但初学的话,就按它默认的吧。我们新建的这个content目录,就是专门用来放JSP文件的。

我们在content目录下建一个JSP文件,命名为“hello.jsp”,内容可以很简单,就在里面写一个简单的话:Hello SImple,代码略。

这时,整个项目的文件夹视图如下:

image

我运行Tomcat服务器,测试一下Struts2配置能不能用。首先我们在地址栏输入://localhost:8060/SimpleWeb/hello.jsp ,很遗憾,不管用了,报错了:HTTP Status 404 - The requested resource (/SimpleWeb/hello.jsp) is not available.截图如下:

image

正确的做法是,输入地址: //localhost:8060/SimpleWeb/hello.action 或者//localhost:8060/SimpleWeb/hello 如果出现如下结果,就说明Struts2配置成功了。

image

 

注意一点,这只是在WEB-INF/content目录下的文件是通过这种方式访问的;如果不是在这目录下,而在项目目录下,即Eclipse对应项目的WebContent下,就不能这样访问了。举例说,在项目根目录下建个hello.jsp的文件,则我们只能通过//localhost:8060/SimpleWeb/hello.jsp来访问。

能通过hello.action或者hello访问WEB-INF/content下的hello.jsp,这种做法,是Struts2.1.6跟Struts2.0不同之处之一。使用时请确保你使用的Struts版本是2.1.6+。相关的命名规范与默认的action匹配规则,请参考官方的文档://struts.apache.org/2.1.6/docs/convention-plugin.html

我们再新建一个Java类,命名为HelloAction,此类须继承com.opensymphony.xwork2.ActionSupport,代码如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;


public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("HelloAction execute ... ");
        return SUCCESS;
    }
}

让我们再次访问://localhost:8060/SimpleWeb/hello.action 或者//localhost:8060/SimpleWeb/hello 

可以看出,在Eclipse的控制台确定打印出了以下信息,这说明,访问请求确定经过了HelloAction类。

image

同时页面是跳到了WEB-INF/content/hello.jsp文件(如下图),这说明请求的确是从HelloAction类转发到了hello.jsp。

image

看来,好像在不做什么配置,Struts2.1.6也会找到名为HelloAction的类来处理…/hello.action或者…/hello的请求,而好像也没有做什么配置,HelloAction会自动将请求转发给名为hello.jsp的页面,这正是Struts2.1.6的妙用之处,全赖struts2-convention-plugin-2.1.6.jar这个插件,具体了解,可看我上面提供的官方链接,或者看这位帅哥的翻译之作:struts2采用convention-plugin实现零配置。

看了上面的HelloAction的代码若感到莫名其妙的话,我这里把那些默认的、约定俗成的代码也写出来,这样,修改后的HelloAction类如下:

package cn.simple.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;

@Results({
    @Result(name="success",location="hello.jsp",type="dispatcher")
})

public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        System.out.println("HelloAction execute ... ");
        return SUCCESS;
    }
}

这样就容易明白许多了。解释如下:

name = “success” 跟 Action里的execute()方法的返回值SUCCESS(也可写成“success”)对应,即若此Action类一旦返回SUCCESS,就会跳到对应的这个Result去处理。
location = “hello.jsp”,表示请求由这个Action跳转到hello.jsp这个页面。
type = “dispathcer”,表示转发方式,具体解释见下面。


其中type=”dispatcher”表示请求转发,还有另一种常用的叫做type=”redirect”重定向,在下文会出现。Struts2的请求转发和重定向的区别其实跟Java Servlet里的是差不多的。Servlet里与其功能等价的的代码片断如下:

request.getRequestDispatcher("hello.jsp").forward(request, response);    //请求转发
response.sendRedirect("hello.jsp");    //重定向

两者的区别可以这样理解:请求转发(Dispatcher)在转发到的另一页面(如hello.jsp)还能保留Request域里的东西,而重定向(Redirect)的话,就跟它的名字“重定向”一样,跳到了另一个页面(如hello.jsp),不再跟原来页面(或者一个action、或者一个Servlet,或者JSP页面)有任何瓜葛,不会保存原来页面Request域的东西?;褂幸桓霰砻嫔系那鹁褪牵呵肭笞ⅲ―ispatcher)到另一个页面(如hello.jsp)后,地址栏里显示的仍然是上一个页面(这里称页面不太合适)的路径(如hello.action),而重定向则显示的是新跳到的那个页面的路径。大家自己测试一下,观察一下,其实也挺容易理解的。

Struts 2.1.6 精简实例系列教程第一期——环境的搭建与HelloSimple介绍就到此,敬请期待下文!



心梦帆影 2009-07-18 17:27 发表评论
]]>
Struts 2.1.6 精简实例系列教程(正在发表中,敬请关注~~) - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/04/285449.html心梦帆影心梦帆影Sat, 04 Jul 2009 03:55:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/04/285449.html//www.ot7t.com.cn/rongxh7/comments/285449.html//www.ot7t.com.cn/rongxh7/archive/2009/07/04/285449.html#Feedback7//www.ot7t.com.cn/rongxh7/comments/commentRss/285449.html//www.ot7t.com.cn/rongxh7/services/trackbacks/285449.html教程别名:基于Struts 2.1.6 的SimpleWeb小项目开发教程

实例项目名:SimpleWeb

内容提要:

Struts 2.1.6 精简实例系列教程(1):环境的搭建与HelloSimple

Struts 2.1.6 精简实例系列教程(2):用户登录??榈氖迪?/a>

Struts 2.1.6 精简实例系列教程(3):新闻管理Model层的开发(整合iBatis)

Struts 2.1.6 精简实例系列教程(4):新闻管理??榈氖迪?/a>

Struts 2.1.6 精简实例系列教程(5):用户注册??椋ㄕ螶query)

Struts 2.1.6 精简实例系列教程(6):重写用户登录??椋ㄕ螶query+JSON)

 

…… 其他内容,如果大家需要,请跟我说一下,我会考虑加入我的教程中。

 

原则:不要因技术而学技术,而要根据需要而学:Struts 2.x有些东西是不需要用或者很少用到的,在本教程中就没有涉及到。



心梦帆影 2009-07-04 11:55 发表评论
]]>
[图解教程]Eclipse不可不知的用法之四:配置服务器与项目的新建运行 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285241.html心梦帆影心梦帆影Thu, 02 Jul 2009 12:53:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285241.html//www.ot7t.com.cn/rongxh7/comments/285241.html//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285241.html#Feedback0//www.ot7t.com.cn/rongxh7/comments/commentRss/285241.html//www.ot7t.com.cn/rongxh7/services/trackbacks/285241.html这么有失水准的文章,真不好意思再写了。但毕竟还是有些初学者不熟悉,截些图来看一下配置服务器的过程吧。

(7) 配置Tomcat服务器

这里以配置Tomcat 6.0为例。

image

选择Server下面的Runtime Environments:

image

点击右边的“Add”按钮,进“New Server Runtime Environment”对话框,选择我们要配置的Tomcat版本,这里选用了Tomcat v6.0,注意要与你下载的版本一致。

image

Next后进入下图:

image 

在Tomcat installation directory右边的Browse按钮,点击它,进入本地磁盘目录,选择你的Tomcat安装目录,如下:

image

确定后,回到刚才那个对话框,点击JRE右边的Installed JREs按钮,进入下图的界面:

image

如果这里已经配置了JDK,则直接选择即行,如果没有配置的话,就点右边的“Add”,添加一个标准的JRE

image

Next,下图,点右边的Directgry浏览本地文件系统,找到JDK的安装目录。

image

好,确定 – finish,下一步,完成。如下图:

image

 

(8) 项目的新建、添加jar包、运行。

一般我们用这个工具来做Web项目,就建一个动态Web工程吧:

image

如果上图的选项中没有Dynamic Web Project的话,可在最下面Other那里找到,又或者通过定制菜单将这一项显示在这里,关于如何定制菜单,请看我的[图解教程]Eclipse不可不知的用法之三:定制视图与New菜单项。

进入下图界面,在Project name中输入工程名,这里起名为“HelloWorld”,在Target runtime中选择刚才我们配置的Tomcat 6.0服务器。如下图:

image 

行了,完成。

关于如何把外部的jar包引进我们的项目中来,这个其实很简单,复制那些jar文件,在下图的lib目录下右键粘贴即行。

image

关于如何运行Web项目,Eclipse for JavaEE与MyEclipse的做法不同。

image

进入下图,找到我们配置的服务器:

image

Next – > finish即行。

 

好了,Eclipse系列图解教程,到这里,暂告一段落,都是说一些很基础的东西,有什么不足之处,请大家多多包涵!



心梦帆影 2009-07-02 20:53 发表评论
]]>
[图解教程]Axis2与Eclipse整合开发Web Service之二:WSDL逆向生成服务端 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285193.html心梦帆影心梦帆影Thu, 02 Jul 2009 07:47:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285193.html//www.ot7t.com.cn/rongxh7/comments/285193.html//www.ot7t.com.cn/rongxh7/archive/2009/07/02/285193.html#Feedback9//www.ot7t.com.cn/rongxh7/comments/commentRss/285193.html//www.ot7t.com.cn/rongxh7/services/trackbacks/285193.html       一般开发Web Service,是选写服务端,再根据生成的WSDL文件生成客户端??垂槐維OA的书中说,如果实现防止不同语言一些特定的数据类型的不兼容性,推荐先定义WSDL接口,包括一输入输出参数、返回值及相关的数据类型等,再通过WSDL来生成服务器端和客户端,这样的好处是:服务端不用关心客户端怎么调用,客户端也不用关系服务端如何实现。

       关于Eclipse中Axis2的配置方法,请看我的[图解教程] Axis2与Eclipse整合开发Web Service之一:简单的计算服务例子,下面来新建一个WSDL文件,如下图:

image

改个名字为“manager.wsdl”,如下图:

image

下一步,定义命名空间和协议等信息,默认即行。如下图:

image

finish后,会在主工作区出现如下图:

image

这是manager.wsdl的图形化形式,点击“Source”会可查看到源代码:

image

这是默认生成的wsdl,我们要根据我们的项目需要,修改上面的图,首先对方法名进行修改,如下图:

image

可见,修改之后,右边的input和output也跟着修改了,这两个就是定义plus的输入和输出。

点击input参数“plus”右边的提示箭头,进入下图:

image

就在这里定义输入参数和和参数类型等信息,因为我们plus(float x, float y)方法中有两个参数x和y,故我们将上图改成两个参数的序列:

image

变成下图,对比一下方法plus(float x, float y),下图也不会太难理解吧!

image

我们返回manager.wsdl视图,选择output参数右边的箭头,进入下图:

image

我们在这里设置float plus(float x, float y)方法的返回值及其类型,因其返回值只有一个,我们只须把上面的out的类型改成我们方法中用的float,改后,如下图:

image

有没有注意到上图左上角有个image 图标,点击它,进入下图:

image

我们可以在这里对输入输出的参数及其他数据类型进行修改,如果在上面的操作过程中,不小心产生了多余的标签的话,也可以在这里去除。

好了,我们再回到manager.wsdl,在源代码视图里右键选“Validate”,对xml文档进行检验,如果有错误的,就根据需要修改。

image

好了,图形化编写的wsdl文档完成了,顺便说一下,方法是可以定义多个的,如下图:

image

为简单起见,我们就先以刚才做定义的那个方法为例,看看,如何根据wsdl文件,自动生成Web Service的服务器端。

 

我们New一个Web Service,如下图:

image

记得在Web Service type中选择“Top down Java Bean Web Service”,如下图:

image

然后,在Service definition中找到刚才写的那个manager.wsdl文件。

image 

回到Web Service对话框,将服务类型的滑块调到“Develop service”处,

image

接下来,就next –> next –-> finish就行。它会自动生成Web Service服务端的接口和类,在类中,可找到我们定义的方法:

image

我们只要修改方法plus的方法体,以实现我们要实现的功能即行。如下:

image

这是通过WSDL反向生成Web Service服务端的最简单一个例子,可能看不到有什么好处,没有像[图解教程] Axis2与Eclipse整合开发Web Service之一:简单的计算服务例子那样的简便快捷,但如果是一些特有的数据类型,如List,Set,这些,我们有在WSDL图形化设计中找到相应的替代类型,先定义WSDL再生成服务端接口,这样做,不仅Java开发客户端是没有问题的,用C#开发客户端也能成功没有出错!

但如果先开发服务器端的话,如果用到一些Java特有的数据类型,如List,Set,如果用其他语言生成的客户端,就可能出问题。同理,用C#开发服务端,如果用到像DataSet这样的返回类型的话,那如果用Java或者其他语言去开发客户端,也可能会出现问题的。

如果统一先写WSDL,再根据WSDL生成服务端和客户端,应该是一种很不错的做法,Eclipse在这方面的图形化支持给带给我们事半功倍的效果,这样做,也比较符合SOA的做法。



心梦帆影 2009-07-02 15:47 发表评论
]]>
[图解教程]Eclipse不可不知的用法之三:定制视图与New菜单项 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/06/29/284564.html心梦帆影心梦帆影Mon, 29 Jun 2009 03:20:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/06/29/284564.html//www.ot7t.com.cn/rongxh7/comments/284564.html//www.ot7t.com.cn/rongxh7/archive/2009/06/29/284564.html#Feedback1//www.ot7t.com.cn/rongxh7/comments/commentRss/284564.html//www.ot7t.com.cn/rongxh7/services/trackbacks/284564.html关键词:Show View , 显示视图, Customize Perspective , 定制New菜单栏, Eclipse for JavaEE,  图解使用教程

(5)定制视图

定制前的视图:

image

菜单栏中Window –> Show View –> Other

image

进入“Show View”对话框,在这里选择须要显示的视图,点“OK”即行。

image

为测试,我选择几个常用的视图,如:java/Package Explorer , Data Management/Data Source Explorer , General/Internet Web Browser , General/Console 等等。

定制后,我们将其拖放到想要放置的地方即行,显示如下图:

image

 

(6)定制New选项

原始的New选项:

image

如果我们须要建的文件类型不在上图右边的选项栏中的话,就需要点“Other”进入下一个对话框去选择,有没有办法使得右边的选项栏中出现我们常常须要建的文件类型,而去掉那些不常使用的呢?

点Window –> Customize Perspective:

image

进入Customize Perspective -Web对话框,选择最右边的选项卡Shortcuts,在Submenus中选择New,那么下面所列出的,若是选中的,则表示是在New菜单项中显示的。我们逐个逐个来,把要显示的选中,把不要显示的去掉。

image

定制后的New选项:

image

只显示我们常用的,简洁了许多吧。



心梦帆影 2009-06-29 11:20 发表评论
]]>
[图解教程]Eclipse不可不知的用法之二:自动生成接口和JUnit测试类 - ★四川福利彩票快乐12★快乐12开奖直播★快乐12开奖★辽宁福彩快乐12★快乐彩12选5走势图//www.ot7t.com.cn/rongxh7/archive/2009/06/28/284438.html心梦帆影心梦帆影Sat, 27 Jun 2009 19:33:00 GMT//www.ot7t.com.cn/rongxh7/archive/2009/06/28/284438.html//www.ot7t.com.cn/rongxh7/comments/284438.html//www.ot7t.com.cn/rongxh7/archive/2009/06/28/284438.html#Feedback4//www.ot7t.com.cn/rongxh7/comments/commentRss/284438.html//www.ot7t.com.cn/rongxh7/services/trackbacks/284438.html关键词:Extract Interface、抽取接口、JUnit Test Case、JUnit测试、自动生成接口、自动生成测试类、Eclipse-jee使用方法、自动生成代码、Eclipse3.5、图解使用教程

(3)通过类自动生成它的接口:

在Spring应用中,常?;嵊玫?#8220;接口+实现类”的形式,即要实现类又要写一个方法差不多的接口,有时候感觉比较烦琐。其实,Eclipse可以根据类自动抽取出接口来。

PersonServiceImpl.java的代码如下:

image

在上面代码的空白处点右键,或者在PersonServiceImpl类名上点右键 —> Refactor –> Extract Interface,如下图:

 image

在“在Extract Interface”对话框中,Interface name框中输入接口名:PersonService,将addPerson和queryPerson方法钩选上,如下图:

image

点OK后,即可自动生成PersonServiceImpl.java的接口类PersonService.java,如下图:

image

而再看看PersonServiceImpl类代码有了什么变化:

image

 

(4)自动生成Junit测试类

在类名上点右键 –> New –> Other ,如下图:

image

在新建对话框中,选择Java >> Junit >> Junit Test Case

image

在“New Junit Test Case”对话框中,填写测试类名,此处,用默认(PersonServiceTest)即行,如果不想测试类与PersonService类置同一包下,可在Package中选择指定的包来存放测试类,此处也默认处理。如下图:

image

点Next后进入下图,将要测试的方法钩选中,Finish即行。

image

如果第一次建测试类,它要求加入JUnit的jar包,点OK即行。如下图:

image

这时,JUnit测试类PersonServiceTest.java便自动生成了,如下图:

image

我们只须修改测试类的方法的方法体,即可进行测试。



四川福利彩票快乐12 2009-06-28 03:33 发表评论
]]>