java环境变量配置

 

Java SE Downloads

windows xp下配置JDK环境变量:
1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:/java/jdk1.5.0_08;

  2.安装完成后,右击“我的电脑”,点击“属性”;

      3.选择“高级”选项卡,点击“环境变量”;

      4.在“系统变量”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击“编辑”,不存在则点击“新建”;

      5.JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:/java/jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依*此变量);

       Path使得系统可以在任何路径下识别java命令,设为:

%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin

    CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别,设为:

.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar (要加.表示当前路径)

  %JAVA_HOME%就是引用前面指定的JAVA_HOME;

       6.“开始”->;“运行”,键入“cmd”;

       7.键入命令“java -version”,“java”,“javac”几个命令,出现画面,说明环境变量配置成功;

       8.好了,打完收工。下面开始你的第一个java程序吧。

下面讲讲java几个环境变量的含义和linux下的配置方法:

通常,我们需要设置三个环境变量:JAVA_HOME、PATH 和 CLASSPATH。

JAVA_HOME:该环境变量的值就是 Java 所在的目录,一些 Java 版的软件和一些 Java 的工具需要用到该变量,设置 PATH 和 CLASSPATH 的时候,也可以使用该变量以方便设置。

PATH:指定一个路径列表,用于搜索可执行文件的。执行一个可执行文件时,如果该文件不能在当前路径下找到,则依次寻找 PATH 中的每一个路径,直至找到。或者找完 PATH 中的路径也不能找到,则报错。Java 的编译命令 (javac),执行命令 (java) 和一些工具命令 (javadoc, jdb 等) 都在其安装路径下的 bin 目录中。因此我们应该将该路径添加到 PATH 变量中。

CLASSPATH:也指定一个路径列表,是用于搜索 Java 编译或者运行时需要用到的类。在 CLASSPATH 列表中除了可以包含路径外,还可以包含 .jar 文件。Java 查找类时会把这个 .jar 文件当作一个目录来进行查找。通常,我们需要把 JDK 安装路径下的 jre/lib/rt.jar (Linux: jre/lib/rt.jar) 包含在 CLASSPATH 中。

PATH 和 CLASSPATH 都指定路径列表,列表中的各项 (即各个路径) 之间使用分隔符分隔。在 Windows 下,分隔符是分号 (;),而在 Linux 下,分隔符是冒号 (:)。

下面分别说明三个环境变量在 Windows 和 Linux 下如何设置,不过在此之前,我们需要做个假设。假设 JDK 在 Windows 下的安装路径是 C:/jdk/,在 Linux 下的安装路径是 /usr/local/jdk/。那么,安装后的 JDK 至少会包括如下内容:

C:/jdk (/usr/local/jdk)
|– bin
|– demo
|– include
|– jre
| |– bin
| -- lib
— lib

***** 在 Windows 下设置

Windows 下使用 set 命令设置环境变量,为了使每一次启动计算机都设置这些环境变量,应该在系统盘根目录下的 autoexec.bat 文件中进行设置,如:

set JAVA_HOME=C:/jdk
set PATH=%JAVA_HOME%/bin;C:/Windows;C:/Windows/Command
set CLASSPATH=%JAVA_HOME%/jre/lib/rt.jar;.

有些版本的 Windows 不能用 %变量名% 来替换环境变量的内容,那么就只好直接写 C:/jdk 而不是 %JAVA_HOME% 了。另外,C:/Windows 和 C:/Windows/Command 是 Windows 会自动加入路径的,所以可以从设置中去掉。如果在 autoexec.bat 中已经设置了 PATH,那只需要将 %JAVA_HOME%/bin 加到原来设置 PATH 的那条语句中就行了。

CLASSPATH 也可以根据需要设置或者加入其它的路径,比如你想把自己写的一些类放在 C:/java 中,就可以把 C:/java 也添加到 CLASSPATH 中去,set CLASSPATH=%JAVA_HOME%/jre/lib/rt.jar;C:/java;.。

注意,在 CLASSPATH 中包含了一个“当前目录 (.)”。包含了该目录后,就可以到任意目录下去执行需要用到该目录下某个类的 Java 程序,即使该路径并未包含在 CLASSPATH 中也可以。原因很简单:虽然没有明确的把该路径包含在 CLASSPATH 中,但 CLASSPATH 中的 “.” 在此时就代表了该路径,如:

假设在 C:/java 目录下有可运行的类 HelloJava.class,那么

C:/> set CLASSPATH=C:/jdk/jre/lib/rt.jar;. // 设置 CLASSPATH 环境变量,注意最后有一个 “.”
C:/> cd java // 转到 C:/java 目录
C:/java> java HelloJava // 运行 HelloJava
Hello, Java. // 运行结果
C:/java> _

**** 在 Linux 下设置

Linux 下使用“变量名=变量值”设置变量,并使用 export 命令将其导出为环境变量。为了使每一次登录都自动设置好这些变量,你需要在 ~/.bash_profile 里或者 ~./bashrc 里进行设置,如

export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:.

设置 PATH 时用的 $JAVA_HOME 是指替换变量 JAVA_HOME 的值到 $JAVA_HOME 所在位置。如上句实际就是 export PATH=/usr/local/jdk/bin:$PATH。这句中 $PATH 也是同样的作用,不过这里的 PATH 是指以前设置的 PATH 变量的值,而非本次设置 PATH 变量的值。

注意,在 CLASSPATH 中包含了一个“当前目录 (.)”。包含了该目录后,就可以到任意目录下去执行需要用到该目录下某个类的 Java 程序,即使该路径并未包含在 CLASSPATH 中也可以。原因很简单:虽然没有明确的把该路径包含在 CLASSPATH 中,但 CLASSPATH 中的 “.” 在此时就代表了该路径,例如

假设在 /home/fancy/java 目录下有可运行的类 HelloJava.class,那么

[[email protected] fancy]$ export CLASSPATH=/usr/local/jdk/jre/lib/rt.jar:. // 设置 CLASSPATH,注意最后的“.”
[[email protected] fancy]$ cd ~/java // 转到 /home/fancy/java
[[email protected] java]$ pwd // 显示当前目录
/home/fancy/java // 当前目录是 /home/fancy/java
[[email protected] java]$ java HelloJava // 运行 HelloJava
Hello, Java // 运行结果
[[email protected] java]$ _

***** 实例分析

只是操作系统不同,略有差别。

两个例子都提到一个“可运行的类”,它是指包含了 public static void main(String[] args) 方法的类,这将在下一章 HelloJava 一节中详述。例中的 CLASSPATH 均未包含 HelloJava.class 所在的目录(C:/java, /home/fancy/java),但是均包含了当前目录 (.)。因此转到包含 HelloJava.class 的目录下去执行 java HelloJava,在 Java 寻找到 CLASSPATH 中的“. (当前目录,C:/java, /home/fancy/java)”时,找到了 HelloJava.class,运行成功。

windows2008下iis7伪静态url中有加号或空格不能解析解决办法

错误提示:iis7.0请求筛选模块被配置为拒绝包含双重转义序列的请求

要解决此问题,请请按照下列步骤操作。

请注意 按照这些步骤后,在运行 IIS 的服务器的安全级别可能会降低。 因此,将 allowDoubleEscaping 属性设置为 True 之前,请考虑所涉及的风险。

  1. 单击 开始 ,在 开始搜索 框中键入 记事本 右键单击 程序 列表中的 记事本 ,然后单击 以管理员身份运行 。 如果将提示您输入管理员密码或进行确认,键入您的密码,或单击 继续 
  2. 在 文件 菜单上单击 打开 ,在 文件名 框中键入 %windir%\System32\inetsrv\config\applicationHost.config 然后再单击 打开 
  3. 在该 ApplicationHost.config 文件找到 requestFiltering XML 元素。
  4. 为 True ,请更改该 allowDoubleEscaping 属性的值。 为此,请使用类似下面的示例代码的代码
  5. 在 文件 菜单中上, 单击 保存 
  6. 退出记事本。

重要 当启用双转义的序列时,在运行 IIS 的服务器的安全级别可能会降低。

在前面的步骤将直接编辑 applicationHost.config 文件的并在服务器级别配置此设置中。 若要配置此设置,也可以使用 appcmd 命令。 要这样做,请按下列步骤操作:

  1. 单击 开始 ,单击 运行 ,然后键入在 打开 框中的 cmd 。
  2. 键入下面的命令,然后按 Enter 键:
  3. 运行下列命令之一:
    • 请注意 这将配置设置” Web 站点”的根文件夹中 Web.config 文件。

    • 请注意 这将为配置此设置仅”默认 Web 站点”applicationHost.config 文件中使用位置标记

java与json互相转换(解决日期问题)

JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文主要讲解下java和JSON之间的转换,特别是解决互相转换遇到日期问题和指定属性的过滤。
一、需要相关的jar包:
json-lib-xxx.jar
ezmorph-xxx.jar
commons-httpclient-xxx.jar
commons-lang-xxx.jar
commons-logging-xxx.jar
commons-collections-xxx.jar
上面的包可以从下面的连接下载:
http://commons.apache.org/index.html
http://json-lib.sourceforge.net
http://ezmorph.sourceforge.net
二、java-》JSON
1.List-》JSON

打印结果:list->json:[“apple”,”orange”]
2.Map-》JSON

打印结果:map->json:{“age”:30,”name”:”Michael”,”baby”:[“Lucy”,”Lily”]}
3.bean->JSON

打印结果:bean->json:{“age”:1,”born”:{“date”:10,”day”:3,”hours”:14,”minutes”:14,”month”:2,”seconds”:1,”time”:1268201641228,”timezoneOffset”:-480,”year”:110},”name”:”NewBaby”}
4.bean->JSON 日期转换
上面的例子中你会发现它把bean对象里的util.Date这个类型的所有属性一一转换出来。在实际运用过程中,大多数情况下我们希望能转化为yyyy-MM-dd这种格式,下面就讲一讲如何实现:
首先要写一个新的类JsonDateValueProcessor如下:

测试代码:

打印结果:bean->json:{“age”:1,”born”:”2010-03-10″,”name”:”NewBaby”}
这就能得到我们想要的结果了。
4.java->JSON 过滤指定的属性

打印结果:bean->json [add property filter] :{“age”:1,”name”:”NewBaby”}
从执行结果可以看出:born 这个属性已经成功过滤掉了。
三、JSON-》java
1.如何把json的yyyy-MM-dd的转换为Bean中的util.Date类型:

打印结果:
1984-01-12
1990-05-01
2. JSON-》List、 Map

打印结果:
apple
orange
name  Michael
age  30
baby  [Lucy, Lily]

解决struts2.1与servlet过滤器url-pattern冲突

方法一:修改过滤规则为<url-pattern>/*.action</url-pattern>
方法二:
2.0.*版本default.properties文件:struts.action.extension=action
2.1.6版本:struts.action.extension=action,,
这个后缀是过滤所有
修改这个属性即可
PS:struts2过滤器不推荐用org.apache.struts2.dispatcher.FilterDispatcher。
文档如下:“Deprecated. Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one”
2.1.3以上版本推荐用StrutsPrepareAndExecuteFilter,StrutsPrepareFilter ,StrutsExecuteFilter,ActionContextCleanUp

还有一个办法,是修改struts.xml的配置参数,如:
<constant name=”struts.action.excludePattern” value=”/servlet/.*,/fck/.*” />
其中的value值是正则表达式,可以写多个,只要匹配表达式的URL访问都不会被struts2进行Filter了。

Servlet和Filter的url匹配以及url-pattern详解

Servlet和Filter的url匹配以及url-pattern详解

Servletfilter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间

    一,servlet容器对url的匹配过程:

 

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:<o:p></o:p>

1.     精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

2.     最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

3.     扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

    二,url-pattern详解

在web.xml文件中,以下语法用于定义映射:

l 以”/’开头和以”/*”结尾的是用来做路径映射的。

l 以前缀”*.”开头的是用来做扩展映射的。

l “/” 是用来定义default servlet映射的。

l 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

Struts2全局拦截器配置

首先在struts.xml中配置一个全局的package继承struts-default,命名为abstract_struts,然后在别的配置文件继承这个abstract_struts
<package name=”sysDept” extends=”abstract_struts” namespace=”/”>

C#解析、序列化JSON字符串的利器—Json.NET

Json.NET的简单介绍

首先介绍一个为方便在.NET中使用JSON的API,Json.NET。它方便我们读取从浏览器流向服务器的JSON对象,也方便在响应流中写入JSON对象。

Json.NET只提供了服务器端的方法,主要有实现JSON文本与XML互相转换的类,有自定义读写JSON的JsonReader类和JsonWriter类,还有一个非自定义读写JSON的JavaScriptSerializer类。

ASP.NET AJAX中,服务器端由JavaScriptSerializer类的几个方法来用于实现序列化和反序列化能力。在Json.NET中,服务器端的序列化 和反序列化能力则主要由JavaScriptConvert类的几个方法提供。本篇的例子只使用了JavaScriptConvert。

  1. JavaScriptConvert
    • Json.NET中,这个类用于序列化和反序列化JavaScript对象。
    • 这个类有两个方法:
      1. SerializeObject(object value, params JsonConverter[] converters),序列化,它有个重载方法SerializeObject(object value)
      2. DeserializeObject(string value, Type type),反序列化,它有个重载方法DeserializeObject(string value)

在客户端,Json.NET未提供支持。如果需要则可以结合使用上一篇“What is JSON:初识JSON”提到的json.js来处理客户端的系列化与反序列化。

下面我们尝试用这个API在ASP.NET中实现用JSON交互数据。

使用Json.NET在C/S中交互JSON数据的简单例子
  1. 先新建一个ASP.NET 网站。
  2. 将下载到的Binary文件夹中的Newtonsoft.Json.dll和Newtonsoft.Json.XML放入网站的bin文件,当然要先新建bin文件夹。然后对dll添加引用。
  3. 切 换到设计模式,从标准工具箱向页面上添加三个Label,Text分别为EmployeeID、EmployeeName、EmployeeInfo;三 个Textbox,ID分别为txtID、txtName、txtInfo;然后添加一个Button,ID为btnToJSONString,Text 为Invoke ToJSONString;然后添加一个Textbox,ID为txtJSON,Textmode为MultiLine,rows设为5;接着再分别添加 一个Button和Textbox,ID为btnToObject、txtStrEmployee,Button的Text为Invoke ToStrEmployee。
  4. 添加一个WebService项目。
    • 编写一个Employee类,然后两个WebMethod,接着在项目中对该Web服务添加引用。代码如下:[csharp]using System;
      using System.Web;
      using System.Collections;
      using System.Web.Services;
      using System.Web.Services.Protocols;
      using Newtonsoft.Json;class Employee
      {
      private string[] employeeInfo;
      public int EmployeeID;
      public string EmployeeName;
      public string[] EmployeeInfo
      {
      get { return this.employeeInfo; }
      set { this.employeeInfo = value; }
      }
      }
      /**/
      /// <summary>
      /// WebService 的摘要说明
      /// </summary>
      [WebService(Namespace = “http://tempuri.org/”)]
      [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
      public class WebService : System.Web.Services.WebService
      {
      public WebService()
      {
      //如果使用设计的组件,请取消注释以下行
      //InitializeComponent();
      }
      [WebMethod]
      public string ToJSONString(int employeeID, string employeeName, string[] employeeInfo)
      {
      Employee employee = new Employee();
      employee.EmployeeID = employeeID;
      employee.EmployeeName = employeeName;
      employee.EmployeeInfo = employeeInfo;
      return JsonConvert.SerializeObject(employee);
      }
      [WebMethod]
      public string ToStrEmployee(string strJSON)
      {
      Employee decerializedEmployee = (Employee)JsonConvert.DeserializeObject(strJSON, typeof(Employee));
      return “ID: ” + decerializedEmployee.EmployeeID + ” ”
      + “Name: ” + decerializedEmployee.EmployeeName + ” ”
      + “Info: ” + decerializedEmployee.EmployeeInfo.GetValue(0).ToString();
      }
      }[/csharp]

成员的属性类型分别为数字、字符串和数组。

5、对两个Button编写事件代码
























 

6、按Ctrl + F5运行;在EmployeeID、EmployeeName、EmployeeInfo中输入123、Hunts.C及一些个人信息(用逗号隔开);点 击Invoke ToJSONString,经服务器端序列化后,结果在txtJSON文本框中;然后点击Invoke ToStrEmployee,此时txtJSON文本框中的JSON文本传输给服务器端,服务器端读取该JSON并反序列化成对象,而后在 txtStrEmployee中写入Employee的成员值。

\

只需要知道json里头除了name(名称)就是value(值),值有好几种格式,如果是数字就不用加引号,如果加了引号就是字符串,如果用[]包裹就是数组,如果出现{}就说明是嵌套的json。诸如此类。