Spring AOP + AspectJ framework


AOP(Aspect Orient Programming),也就是常说的面向方面编程,它是作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)

中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。

简单点来说,它就是一个拦截器可以拦截一些进程,例如,当某个方法执行时,Spring AOP 可以拦截该执行的方法,并允许在方法执行之前或之后添加额外的功能,

以上如若解释的不好,勿喷 -_- ||

AspectJ 是一个基于 Java 语言的 AOP 框架,提供了强大的 AOP 功能,Spring 从 2.0 起,对 AspectJ 功能都提供了支持 .

几个常用的 AspectJ 注解 : 

    @Before   在方法执行前被执行

    @After     在方法执行后被执行

    @AfterReturning     在方法执行后被执行,并同时拦截方法返回的结果

    @AfterThrowing      在方法抛出异常时候被执行,若方法不抛出异常,则不会被执行

    @Around   这个,不知道要怎么解释了,比较不好解释,就像你拦截了一个方法,并在适当的时候给予放行,放行前后可以做额外的处理,下面看示例就很容易明白了

环境 :

JAVA–第四周实验–任务2–求任意整数降序数的程序

[java] view plaincopy
/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称:对于一个大于3位数的任意整数,输出其降序数。例如,整数82319,则其降序数是98321.
* 算法提示:将整数的各位数分解到一维数组a中,再将a数组中的元素按降序排序,最后输出a数组元素值。
* 作 者: 雷恒鑫
* 完成日期: 2012 年 09 月 19 日
* 版 本 号: V1.0
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:

* 程序头部的注释结束

*/

import javax.swing.JOptionPane;

public class Task_one {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = JOptionPane.showInputDialog(“输入一个任意整数”);
int number = Integer.parseInt(str);

sort(number);
}

static void sort(int n) {

int i = 0, j, k;
boolean b = true;
int[] a = new int[10];
// int x=n;
while (b) {
a[i] = n % 10; // 分解出个位数
n = n / 10; // 去掉已分解出的数
i++;
if (n == 0) {
b = false;
}
}
k = i;
for (i = 0; i < 10; i++)
// 冒泡降序
for (j = 0; j < 10 - i - 1; j++) {
if (a[j] < a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 0; i < k; ++i) {
// String str=JOptionPane.showInputDialog(a[i]+" ");
System.out.print(a[i] + " ");
}
}
}

运行结果:


本文链接


BlogJava_首页

那些年JavaWeb的各种中文乱码终极解决方法!!

一、Servlet输出乱码

1. 用servlet.getOutStream字节流输出中文,假设要输出的是String str =”钓鱼岛是中国的,无耻才是日本的”。

1.1 若是本地服务器与本地客户端这种就不用说了,直接可以out.write(str.getBytes())可以输出没有问题。因为服务器中用str.getBytes()是采用默认本地的编码,比如GBK。而浏览器也解析时也用本地默认编码,两者是统一的,所以没有问题。

1.1 若服务器输出时用了, out.write(str.getBytes(“utf-8″))。而本地默认编码是GBK时(比例在中国),那么用浏览器打开时就会乱码。因为服务器发送过来的是utf-8的1010数据,而客户端浏览器用了gbk来解码,两者编码不统一,肯定是乱码。当然,你也可以自己将客户端浏览器的编码手工调用下(IE菜单是:查询View->编码encoding->utf-8),但是这种操作很烂,最好由服务器输出响应头告诉,浏览器用哪种编码来解码。所以要在服务器的servlet中,增加response.setHeader(“content-type”,”text/html;charset=utf-8″),当然也可直接用简单的response.setContentType(“text/hmtl;charset=utf-8″)。两种的操作是一样一样的。

2. 用servlet.getWirter字符流输出中文,假设要输出的是String str =”钓鱼岛是中国的,无耻才是日本的”。
2.1 若写成out.print(str)输出时,客户端浏览器显示的将全是多个?????的字符,代表在编码表中肯定就找不到相应的字符来显示。原因是:servlet.getWriter()得到的字符输出流,默认对字符的输出是采用ISO-8859-1,而ISO-8859-1肯定是不支持中文的。所以肯定要首先要做的第一件事:是要将服务器对象输出字符能支持中文的。其次服务器向客户端写回的响应头要告诉客户端是用了哪种编码表进行编码的。而实现这两个需求,只需要response.setContentType(“text/hmtl;charset=utf-8″)。就搞定了。特别注意:response.setContentType(“text/html;charset=utf-8″)要放在PrintOut out = response.getWriter()代码的前面,否则只是有告诉客户端用什么码表编码的功能,而服务器端还是用ISO-8859-1编码了。再特别提示下:在同一Servlet中的doGet或doPost方法中,不能既用response.getOutputStream又用response.getWriter,因为这两种response的响应输出字节流与字符流是冲突的,只能用其一。

二、Servlet文件下载,中文乱码情况。

关键是下载时响应头 content-disposition中attachment;filename=文件名。这个文件名filename不能是含有中文字符串的,要用URLEncoding编码进行编码,才能进行进行http的传输。如下代码示例:
[java] view plaincopy
//获取文件的URL地址
String realPath = getServletContext().getRealPath(“/钓鱼岛是中国的无耻才是日本的历史证据.jpg”);
//获取文件名: 钓鱼岛是中国的无耻才是日本的历史证据.jpg
String fileName = realPath.substring(realPath.lastIndexOf(“\”)+1);
//指示响应流的类型不是text/html而是二进制流数据以指示下载
response.setContentType(“application/octet-stream”);
//注意这里一般都用URLEncoder的encode方法进行对文件名进行编码
String enFileName = URLEncoder.encode(fileName, “utf-8″);
//enFileName文件名若含有中文必须用URLEncoding进行编码
response.setHeader(“content-disposition”, “attachment;filename=”+enFileName);
//文件读取与输出,模板代码了…
InputStream in = new FileInputStream(realPath);
OutputStream out = response.getOutputStream();
int len = -1;
byte[] buf = new byte[1024];
while((len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
in.close();

三、Servlet的response增加addCookie,cookie中value的中文码问题解决方法。
关于cookie的原理,见http://blog.csdn.net/chenshufei2/article/details/8009992。 若想将cookie中存放中文的值,必须用Base64编码后,发给客户浏览器端进入存储。而下次客户端浏览访问是带回来的cookie中的值,是经过Base64编码的,所以需要用Base64解码即可。 Base64编码主要是解决将特殊字符进行重新编码,编码成a-b、A-B、0-9、+与/,字符52,10个数字与一个+,一个/ 共64个字符。它的原理是将原来3个字节的内容编码成4个字节。主要是取字节的6位后,在前面补00组成一个新的字节。所以这样原来的3个字节共24,被编码成4个字节32位了。
具体代码示例如下:
[java] view plaincopy
response.setContentType(“text/html;charset=utf-8″);
request.setCharacterEncoding(“utf-8″);
String getUserName = request.getParameter(“username”);
PrintWriter out = response.getWriter();
String username = null;
//获取客户端提交过来的cookie数组。
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
//遍历cookie数组,找到含有username的key的cookie。
if (Constant.USER_INFO.equals(cookies[i].getName())) {
username = cookies[i].getValue();
//得到cookie的值后必须,进行Base64解码,因为前次生成cookie时,value是经过Base64编码。
username = Base64Coder.decode(username); //进行Base64解码
}
}

out.print(username + ",恭喜您登录成功......"+getUserName); //username从Cookie中得出来,getUserName从请求参数中
System.out.println(username+"------------");
String remember = request.getParameter("remember");
//中文必须要进行 base64进行加码,才能作为cookie的值
getUserName = Base64Coder.encode(getUserName);
//将编码后的中文username的作为cookie的value
Cookie cookie = new Cookie(Constant.USER_INFO, getUserName);
cookie.setPath(getServletContext().getContextPath());
if(null != remember){ //若选择中了,则将Cookie写进去,若没有选择中,则将以前的Cookie都置成空
cookie.setMaxAge(Integer.MAX_VALUE); //设置Cookie是Integer最大数,好似有70多年的存效吧。呵呵
}else{
cookie.setMaxAge(0); //设置成cookie马上失效,maxAge是cookie的存活时间
}
response.addCookie(cookie);

四、获取请求参数乱码
GET方式的乱码:
CN,直接用request.getParameter得到的字符串strCN将会乱码,这也是因为GET方式是用http的url传过来的默认用iso-8859-1编码的,所以首先得到的strCn要再用iso-8859-1编码得到原文后,再进行用utf-8(看具体页面的charset是什么utf-8或gbk)进行解码即可。new String(strCn.getBytes(“ISO-8859-1”),“UTF-8”);
[java] view plaincopy
String strCn = request.getParameter(“name”);
String name = new String(strCn.getBytes(“ISO-8859-1”),“UTF-8”);
这种方式操作比较麻烦的是,有一个参数要用iso-8859-1编码一次再解码一次。
POST方式的乱码:只需要request.setCharacterEncoding(“UTF-8″):即可。
[java] view plaincopy
request.setCharacterEncoding(“UTF-8″);
String name = request.getParameter(“name”);
个人小站 www.software8.co


本文链接


BlogJava_首页

java中的抽象类与接口

一个抽象类只能作为其他类的基类,它不能被实例化。

含有抽象方法的类必然是抽象类。但是抽象类中的方法不必是抽象的。

我们不能将一个抽象类定义成final的。

抽象类的具体子类中必须实现抽象类的所有抽象成员。否则必须将子类也定义为抽象类。

抽象类可以被声明。

接口是特殊的抽象类,所有方法都必须是抽象的和public的。

与普通抽象类不同的是,接口中不能有构造方法,不能含有普通成员变量(变量都是public static final的),不能包含静态方法,

一个类可以实现多个接口,却只能继承一个类。

我们主要用抽象类来实现代码的复用,而接口的可以定义模块之间的规则,对于系统的整个架构设计有很大的作用。


本文链接


BlogJava_首页

【java多线程与并发库】—传统java多线程 线程创建方式

一、Thread类的构造方法

public Thread();

public Thread (Runnable target);

public Thread (Runnable target,String name);

public Thread (String name);

public Thread (ThreadGroup group,Runnable target);

public Thread (ThreadGroup group,Runnable target,String name);

public Thread (ThreadGroup group,String name);

 

二、Java中提供了2种创建线程的方法:

 
 
(1)   继承Thread类(java.lang.Thread)
 
public class Thread extends Object implements Runnable

 

这种方法是将类声明为Thread的子类。该子类应重写Thread类的run方法。接下来可以分配并启动该子类的实例。

 

 实例一:

  1. public class ThreadTest02 extends Thread{  
  2.   
  3.     public void run(){  
  4.         for(int i=0; i<10; i++){  
  5.             System.out.println(“线程”+Thread.currentThread().getName()+“extends Thread is running…”+i);  
  6.         }  
  7.         System.out.println(“线程”+Thread.currentThread().getName()+“执行结束,退出!”);  
  8.     }  
  9.   
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         Thread t1 = new ThreadTest02();  
  13.         t1.setName(“T1″);  
  14.         Thread t2 = new ThreadTest02();  
  15.         t2.setName(“T2″);  
  16.         t1.start();  
  17.         t2.start();  
  18.     }  
  19.   
  20. }  

运行结果:

 

 

2)利用Runnable接口(java.lang.Runnable)

 这种方法是声明实现Runnable接口的类。该类然后实现run方法。然后可以分配该类的实例,在创建Thread时作为一个参数来传递并启动

 

实例二:

  1. public class ThreadTest02 implements Runnable{  
  2.   
  3.     public void run(){  
  4.         for(int i=0; i<10; i++){  
  5.             System.out.println(“线程”+Thread.currentThread().getName()+“implements Runnable interface is running…”+i);  
  6.         }  
  7.         System.out.println(“线程”+Thread.currentThread().getName()+“执行结束,退出!”);  
  8.     }  
  9.   
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         ThreadTest02 t = new ThreadTest02();  
  13.         Thread thread = new Thread(t);  
  14.         thread.start();  
  15.     }  
  16.   
  17. }  

 

运行结果:


个人网站   www.software8.co


本文链接


BlogJava_首页

web入门之tomcat配置

一、修改默认的8080改成80端口。

操作方法:在conf目录中,找到server.xml文件,打开找到
connectionTimeout="20000"
redirectPort="8443" />
并将port=”8080″ 修改成 port=”80″ 即可。重启下tomcat服务即可。

二、给应用指定一个默认主页的方法。

操作方法:在应用的WEB-INF目录中,找到web.xml打开,并添加如下元素。

index.html
index.jsp

三、虚拟目录的配置(不改变虚拟主机,不添加虚拟主机情况)。

方式一:打开conf目录中的server.xml,并 path:虚拟目录名称。必须以/开头 docBase:应用的真实的存放路径。若path=”",默认根即http://域名或ip 即可访问docBase指定的应用了。不需要加虚拟目录名了。 但一般这种方式需要修改server.xml,修改server.xml都需要重启tomcat服务器所以不建议使用。
方式二:在tomcat中的Catalina\localhost 新建一个xml,命名虚拟目录名.xml如 doc.xml。那么访问时需要用http://域名或ip:端口号/doc 。 注意前面提到的Catalina,是conf中的server.xml中Engine元素的name属性名,localhost为Host元素的name属性名。 具体举例如下

在K:\tomcat6.0.35\apache-tomcat-6.0.35\conf\Catalina\localhost文件下,新建了一文件doc.xml。xml中具体内容如下:



unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false" />

指定了两个虚拟主机host,为了使域名有效果,在本机中可以在C:\Windows\System32\drivers\etc目录中打开hosts文件,并添加如下元素:
127.0.0.1 www.demo1.com
127.0.0.1 www.demo2.com
接下来,重启tomcat服务器即可以轻松的如下进行访问的:

http://www.demo1.com/myapp1

http://www.demo2.com/myapp2 (这样访问是不是还有点烦,要输入虚拟目录名?嗯,下面引用五、虚拟主机与虚拟目录结合来配置)
五、虚拟主机与虚拟目录结合配置

如何达到访问虚拟主机域名时,不输入目录名直接访问呢?比如访问http://www.demo1.com/,默认就是访问http://www.demo1.com/myapp1呢?
操作方法: 其实很简单,上面的虚拟主机配置中,谈到了要在Engine元素添加新Host元素。那么只需要在Host元素下面添加新的

unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false" />


www.dgbalance.com


本文链接


BlogJava_首页

JAVA技术支持课–第一次java语言技术支持授课思路

Java的起源及应用

Java语言特点

变量与运算符

1. 数据类型:

java 的数据类型分类:

有几种基本数据类型;

String 的简单使用

2. 标识符、关键字、常量、变量:

标识符命名规范;

常用关键字有哪些;

变量命名规范及应如何定义并赋值;

变量之间的转化;

变量的作用域和生存期(给出一个例子);

        3. 运算符的优先级别:

          有哪几类运算,各类中包含哪几个运算符;优先级

4. 输入输出:

           输入:使用Scanner对象实现输入各种类型的变量。

           输出:使用System.out.println()或System.out.print()实现输出,区别。

流程控制语句(顺序,分支,循环 )

1. 顺序:

2 .分支:

          if-else 语句:简单if,if-else,多重if-else,嵌套if-else

switch-case 语句:switch的条件特殊;break用处

3. 循环:

While,do-while ,for:

语法结构;中止条件;死循环

习题部分

1. 使用八种基本数据类型定义八个变量,然后在控制台输出各个变量的值。

2. 已知学生有学号,姓名,性别,年龄,身高,体重六项基本信息,依次从键盘录入该学生信息,完成后输出该生详细信息。

     

3. 张三要购买T恤,T恤单价及数量由用户输入,李四要购买网球,网球单价及数量由用户输入; 计算张三及李四各自消费总额并输出.

4. 从键盘上输入一个整数,计算各个位数之和

     

5. 输入一个数字,使用if语句判断匹配的数字。

如果输入的是:

1>. 打印:您输入的数字是1

2>. 打印:您输入的数字是2

3>. 打印:您输入的数字式3

其他数字 打印:输入了不符合规范的数字

注:使用if-else及switch 两种方式分别实现。

6. 从键盘上输入一个年份,判断该年是平年还是闰年。

7. 从键盘上输入一个年份,并输入一个月份(数字),输出该月份有多少天。

8. 从键盘上输入一个年份,并输入一个月份,计算从当前年份1月1号只当前第month个月共有多少天(如输入年份为2011,月份为3月,则计算,从1月1号到3月1号共多少天。输入年份为2004,月份为10月,则计算,从1月1号到10月1号共多少天即计算从1月n-1月共有多少天)

9. 设有int n,设计一个Java程序,打印出1+3+5+…n之和,变量n的初始值在程序中指定。

10. 实现如下程序:

 1>.写一个程序:输出一个直角三角形(上三角),行数由用户输入,如图1所示:

2>.写一个程序:输出一个直角三角形(下三角),行数由用户输入,入图2所示:

3>.写一个程序:输出一个直角三角形(下三角),行数由用户输入,入图3所示:

            

                         

11. 求1000之内的所有水仙花数

     本程序是Application程序.所谓水仙花数,是指一个三位整数,

 它的各位数字的立方和等于这个数本身.

 例如:371就是一个水仙花数,因为371=3*3*3+7*7*7+1*1*1.

(int i 

bw = i/100;

shw = i%100/10或i/10%10;

gw = i%10

12. 求1000之内的所有完全数

   本程序是一个Application程序.所谓完全数,就是一个数恰好等于它的因子之和.

例如:

  6的因子为1,2,3,而6=1+2+3,因此6就是完全数.

13. 求1~5的阶乘之和

    本程序是一个Application程序,求1~20的阶乘之和,

也就是求表达式1+2!+…+5!的值

 

 

14. 实现一个计算器,用户从键盘输入两个操作数和一个运算符(+、-、*、/、%),系统自动完成计算。

 

相关习题在以后的博客中会陆续解答。


本文链接


BlogJava_首页

HttpsUrlConnection https双向验证

//发布的httpsUrlConnection的服务:

package com.abin.lee.https;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings(“serial”)
public class ReceiveHttpsUrlConnectionRequest extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(“receive https request”);
BufferedReader reader=new BufferedReader(new InputStreamReader(request.getInputStream()));
String line=null;
StringBuffer stb=new StringBuffer();
while((line=reader.readLine())!=null){
stb.append(line);
}
System.out.println(“stb=”+stb.toString());
PrintWriter write=response.getWriter();
write.write(“receive HttpsUrlConnection success”);
write.flush();
write.close();
}
}

//web.xml

<servlet>
<servlet-name>httpsUrlConnectionRequest</servlet-name>
<servlet-class>com.abin.lee.https.ReceiveHttpsUrlConnectionRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpsUrlConnectionRequest</servlet-name>
<url-pattern>/httpsUrlConnectionRequest</url-pattern>
</servlet-mapping>

//HttpsUrlConnection测试类

package com.abin.lee.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
public class HttpsUrlConnectionClient extends TestCase {
// 客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;
private String httpsUrlConnectionUrl = “https://localhost:8443/global/httpsUrlConnectionRequest”;
@Before
public void setUp() {
sslKeyStorePath = “D:\home\tomcat.keystore”;
sslKeyStorePassword = “stevenjohn”;
sslKeyStoreType = “JKS”; // 密钥库类型,有JKS PKCS12等
sslTrustStore = “D:\home\tomcat.keystore”;
sslTrustStorePassword = “stevenjohn”;
System.setProperty(“javax.net.ssl.keyStore”, sslKeyStorePath);
System.setProperty(“javax.net.ssl.keyStorePassword”,
sslKeyStorePassword);
System.setProperty(“javax.net.ssl.keyStoreType”, sslKeyStoreType);
// 设置系统参数
System.setProperty(“javax.net.ssl.trustStore”, sslTrustStore);
System.setProperty(“javax.net.ssl.trustStorePassword”,
sslTrustStorePassword);
System.setProperty(“java.protocol.handler.pkgs”, “sun.net.www.protocol”);
}
@Test
public void testHttpsUrlConnectionClient() {
try {
URL url = new URL(httpsUrlConnectionUrl);
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
HttpsURLConnection connection = (HttpsURLConnection) url
.openConnection();
connection.setRequestProperty(“Content-Type”, “text/xml”);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod(“POST”);
connection.setUseCaches(false);
connection.setReadTimeout(30000);
String user=”abin”;
String pwd=”abing”;
String request=”user=”+user+”&pwd=”+pwd;
OutputStream out = connection.getOutputStream();
out.write(request.getBytes());
out.flush();
out.close();
//接收请求的返回值
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer stb = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
stb.append(line);
}
Integer statusCode = connection.getResponseCode();
System.out.println(“返回状态码:” + statusCode);
reader.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//tomcat配置文件:

 <Connector port=”6060″ protocol=”HTTP/1.1″ 
               connectionTimeout=”20000″ 
               redirectPort=”8443″ />
<Connector port=”8443″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
  SSLEnabled=”true” maxThreads=”150″ scheme=”https”
  secure=”true” clientAuth=”true” sslProtocol=”TLS”
  keystoreFile=”D:\home\tomcat.keystore” keystorePass=”stevenjohn”
  truststoreFile=”D:\home\tomcat.keystore” truststorePass=”stevenjohn” />


本文链接


BlogJava_首页

判断有一个字符是否可以做Java标识符的起始字符或后续字符

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:判断有一个字符是否可以做Java标识符的起始字符或后续字符

* 作 者: 雷恒鑫 
* 完成日期: 2012 年 08   月  4   日
* 版 本 号: V1.0 
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述:
* 程序输出:

* 程序头部的注释结束

*/

  1. // ///////////////////////////////////////////////////////////////////////////  
  2. //  
  3. //  M_Identifier.java  
  4. //  
  5. // 开发者:雷恒鑫  
  6. // ///////////////////////////////////////////////////////////////////////////  
  7. // 简介:  
  8. //      判断有一个字符是否可以做Java标识符的起始字符或后续字符的例程  
  9. // //////////////////////////////////////////////////////////////////////////  
  10. public class M_Identifier {  
  11.     public static void main(String args[])  
  12.     {  
  13.         char c=’猫’;  
  14.         if(Character.isJavaIdentifierStart(c))  
  15.         {  
  16.             System.out.println(“字符\’”+c+”\’可以做标识符的首字符”);    //这是类java.lang.Character的静态成员方法;用来判定给定的字符ch是否可以做Java标识符的起始字符。  
  17.         }  
  18.         else  
  19.         {  
  20.             System.out.println(“字符\’”+c+”\’不可以做标识符的首字符”);//注意:方法System.out.println在输出字符串后自动换行。方法System.out.print在输出字符串后不换行。  
  21.         }  
  22.         if(Character.isJavaIdentifierStart(c))  
  23.         {  
  24.             System.out.println(“字符\’”+c+”\’可以做标识符除首字符外的组成字符”);  //这是类java.lang.Character的静态成员方法;用来判定给定的字符ch是否可以做Java标识符的后续字符。  
  25.         }  
  26.         else  
  27.         {  
  28.             System.out.println(“字符\’”+c+”\’不可以做标识符除首字符外的组成字符”);  
  29.         }  
  30.               
  31.     }  
  32. }  

 

运行结果:

 

 

注意:如果把方法System.out.println更改成方法System.out.print。

  1. // ///////////////////////////////////////////////////////////////////////////  
  2. //  
  3. //  M_Identifier.java  
  4. //  www.dgbalance.com
  5. // 开发者:雷恒鑫  
  6. // ///////////////////////////////////////////////////////////////////////////  
  7. // 简介:  
  8. //      判断有一个字符是否可以做Java标识符的起始字符或后续字符的例程  
  9. // //////////////////////////////////////////////////////////////////////////  
  10. public class M_Identifier {  
  11.     public static void main(String args[])  
  12.     {  
  13.         char c=’猫’;  
  14.         if(Character.isJavaIdentifierStart(c))  
  15.         {  
  16.             <span style=”color:#ff0000;”>System.out.print</span>(“字符\’”+c+”\’可以做标识符的首字符”);  //这是类java.lang.Character的静态成员方法;用来判定给定的字符ch是否可以做Java标识符的起始字符。  
  17.         }  
  18.         else  
  19.         {  
  20.             <span style=”color:#ff0000;”>System.out.print</span>(“字符\’”+c+”\’不可以做标识符的首字符”);//注意:方法System.out.println在输出字符串后自动换行。方法System.out.print在输出字符串后不换行。  
  21.         }  
  22.         if(Character.isJavaIdentifierStart(c))  
  23.         {  
  24.             <span style=”color:#ff0000;”>System.out.print</span>(“字符\’”+c+”\’可以做标识符除首字符外的组成字符”);    //这是类java.lang.Character的静态成员方法;用来判定给定的字符ch是否可以做Java标识符的后续字符。  
  25.         }  
  26.         else  
  27.         {  
  28.             <span style=”color:#ff0000;”>System.out.print</span>(“字符\’”+c+”\’不可以做标识符除首字符外的组成字符”);  
  29.         }  
  30.               
  31.     }  
  32. }  

 

则输出结果为:

经验积累:

1.方法System.out.println在输出字符串后自动换行。方法System.out.print在输出字符串后不换行。

2.我知道了类java.lang.Character的其中了两个静态成员方法的作用。


本文链接


BlogJava_首页

帮同学解决问题–第一次java语言技术支持课(第12题)–求1000之内的所有完全数

出错的源程序如下:

  1. public class test3 {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(“1000内的完数为: ”);  
  9.         int s=0,r=0,n=1000;  
  10.         for(int i=1;i<n;i++)  
  11.         {  
  12.             for(int j=1;j<i;j++)  
  13.             {  
  14.                if(i%j==r)  
  15.                {  
  16.                 s=s+j;  
  17.                }  
  18.             }  
  19.              if(s==i)  
  20.              {  
  21.                 System.out.print(i+” ”);  
  22.              }  
  23.                
  24.         }  
  25.     }  
  26.   
  27. }  

该程序存在的问题:

求不出1000以内的完数。

解决的方法:

1.内层for循环完之后,s应重新清零,开始计算下一个数的所有因子的和。

2.在两层for循环之间加一个语句:s = 0 ;  目的是计算完一个数的完数后,s清零并等待计算下一个数的所有因子的和。

改正后的程序为:

  1. public class Test_3 {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.         System.out.println(“1000内的完数为: ”);  
  9.         int s=0,r=0,n=1000;  
  10.         for(int i=1;i<n;i++)  
  11.         {  
  12.             s=0;  
  13.             for(int j=1;j<i;j++)  
  14.             {  
  15.                if(i%j==r)  
  16.                {  
  17.                 s=s+j;  
  18.                }  
  19.             }  
  20.              if(s==i)  
  21.              {  
  22.                 System.out.print(i+” ”);  
  23.              }  
  24.                
  25.         }  
  26.     }  
  27.   
  28. }  

运行结果:

经验积累:

1.要注意每一个小的细节。


本文链接


BlogJava_首页