精华内容
下载资源
问答
  • 1. 使用exe4j和instal制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码,首先使用exe4j先把自己的文件打包test.exe.我这里打包的是自己的一个工程,其中之一个工程也包括lib包.现在就把我自己的...
  • 改良版的json-lib2.4

    2012-03-08 17:05:15
    大家都知道jsonlib2.4之后有了属性过滤的功能,就是当把一个bean转json的时候能指定哪些属性输出...大家可以反编译了看看。这个改良包我用了一年多了,源码找不着了。好像就新加了这一个类。最近缺分了,发上来攒点。
  • 相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做小工具。 Java右键弹出...
  • Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、...
  • 11.9 把sfilter编译成静态库 243 11.9.1 如何方便地使用sfilter 243 11.9.2 初始化回调、卸载回调和绑定回调 244 11.9.3 绑定与回调 245 11.9.4 插入请求回调 246 11.9.5 如何利用sfilter.lib 249 第12章 文件...
  • 源码编译成软件。 buildout:一个构建系统,从多个组件来创建,组装和部署应用。 BitBake:针对嵌入式 Linux 的类似 make 的构建工具。 fabricate:对任何语言自动找到依赖关系的构建工具。 PlatformIO:多...
  • exe4j和instal4j制作安装包

    千次阅读 2007-12-04 12:01:00
    1. 使用exe4j和instal制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码,首先使用exe4j先把自己的文件打包test.exe.我这里打包的是自己的一个工程,其中之一个工程也包括lib包.现在就把我自己的...

    1.  使用exe4jinstal制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码,首先使用exe4j先把自己的文件打包成test.exe.我这里打包的是自己的一个工程,其中之一个工程也包括lib.现在就把我自己的打包过程向大家展示一下:

    Exe4j打包步骤:

    a.      

    b.       先是出现欢迎界面,这里你可以直拉点击下一步,也可以点击“open”打开你上一次所做的保存,然后一直下步一就可以完成打包。这时为了方便,我直接打开我上一次所作的保存。没有作过保存的读就直接点击下一步;

    c.      

    d.       点击完之后我们就可以看到,这里有两个选择,一个是“regular mode”,另一个是”jar in exe “mode 。前者的功能是直接打包exe,但这个exe没有包含jar文件或者class。所以打包之后你就会有两个文件,一个是exe文件,另一个可能是一个文件夹也可能是一个jar文件,也就是说exe文件是指向jar文件.所以这个时候jar文件还是会暴露于客户.  后者是直接打包成一个exe文件。它里面包含着class文件,但很难被用户解压缩(基本上是不可能被解压缩,不然exe4j也就失去它的功能了).

    所以在这里我选择后者。点击下一步.

    e.      

    输入你所要生成的exe文件简称名,和文件生成路径,点击下一步

    f.       

    输入你的应用程序的名字,和选择图标路径。”allow only a single running instance of the application”是代着是你的程序是否在机子上只能有一个在运行。这个大家可以自己自由选择。有的程序像我写的程序本身自己就已经限制了只能有一个运行着,所以也就没有必要要选择了。

    下面的这个更多选项可以自由选择像”redirection”重新定久,生成的日志文件名以及生成”32_bit or 64bit “是否生成64位的应用程序,使它能够在64位的机子上运行。我们一般选择是的32位的,所以就默认了。

    ,这里就作选择了,我们直接点击下一步l

     

       

    g.      

    可以看到,这里主要有两个选择,选择“主类”,和选择jar包。我们首先点击“绿色的”的小箭头,添加jar包。

    这里不能选择路径,所以我们只能选择archive一个一个的把文件添加进来。包括我们的lib包里的所有文件,它会自动关联,我们选择时候也就不用考虑它是文件夹或者是文件,全部把经选择时来就是.选择完之后,我们点击”main class”,选择程序的主类。

    选择完成后,点击”ok”,点击下一步.

     

    h.      

    i.         这个是限制版本问题,我们一般选择我们程序开发时的版本,我的程序是采用1.6开发,有用到一部分1.6API所以必须在1.6或者更高的版本才能够运行.最主的版本我们可以不写.,设置完成之后,点击下一步.

    j.        

    这里是设置应用程序,就像我们打开netbeaans会出现一个加载界面,直到所以的文件都加载到内存之后,我们才可以使用netbeans IDE。选择图片这后,我们点击下一步,配置文件信息.

    这里一般不做修改,直接点击下一步.

    点击next就完成了去看一下,去看看你刚才所设置exe文件生成上当吧 这是就是我所打包后的文件。不过这个文件会比较大。它只是一个exe。当在如果你想让它小一些。可以在刚才的第二步中选择”regular mode”这个步骤。不过下面我将要讲用instal4j把它打包成安装包,它做出来之后的效果也很不错。最后只是发送一个图标到桌面上。

     

     

     

    下面开始讲如何用instal4j制作安装包:

    这是启动界面。你可点击上一次你作保存的工程,所以这里我也就直接点击上一次所作的保存了。

    它主要有这些六大块,第一块是生成基本信息,第二块是文件目录信息。你的可执行文件,和其它所必需用到的文件。第三块,是制作一个启动,就是exe文件,第四个是打包界面的相关设计,我这时只是做个简单的安装包,所以安装界面也就不追求漂亮了。

    第五步是生成打包程序。第六步是生成。关于instal4j。制作比较简单一些,我在这里也就不多作介绍了,朋友们可以自己研究一下。如有不懂,再联系我。Q:2724015

    34

     

     
    展开全文
  • 于是查了一下,发现是因为没有为servlet-api.jar这个包添加源文件,所以看不到源码,然后去官网下载源码然后用eclipse导入就行了,或者你可以用java的反编译工具把jar包转换java源代码自己看。 下面是文件压缩包...

    今天想看一下httpservlet这个类,发现eclipse关联了tomcat下/lib/servlet-api.jar文件之后仍然看不到源代码。于是查了一下,发现是因为没有为servlet-api.jar这个包添加源文件,所以看不到源码,然后去官网下载源码然后用eclipse导入就行了,或者你可以用java的反编译工具把jar包转换成java源代码自己看。

    下面是文件压缩包,导入里面的java文件夹就可以了


    展开全文
  • jsoncpp-master.zip

    2020-06-05 10:46:04
    JsonCpp C++库,允许操作JSON值,包括与字符串...是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下
  • jsoncpp-src-0.5.0-zhp.zip

    2020-03-24 10:07:52
    C++库,允许操作JSON值,包括与字符串串行化和...是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。
  • Struts2

    2012-12-29 22:02:32
    1 : 配置Struts2   1)把struts.xml放在src文件夹下,项目编译完成时,会自动放到web-inf的class下。  2)把jar包放到web-inf的lib下面...3.如果我们想看struts里面封装类的源码,却只能看到反编译之后的内容,怎

    1 : 配置Struts2 

        1)把struts.xml放在src文件夹下,项目编译完成时,会自动放到web-inf的class下。

         2)把jar包放到web-inf的lib下面。

         3)把struts的内容copy到web.xml下面 。

    2.web.xml下面的<filter-mapping>下的<url-mapping>永远都写成/* 

    3.如果我们想看struts里面封装类的源码,却只能看到反编译之后的内容,怎么办呢?

       找到对应的jar文件,右键 ...external Folder

    有的时候我们也需要看它的doc文档,也是通过上面的类似的操作,这样就可以直接在eclipse里面查看说明内容。

    找到类,按F1 。之后就可以直接看类的api文档。。\

    Eclipse中 :添加struts2 source

    我一般是这样添加的

    1、将源包跟jar包都放到lib中
    2、选中一个使用jar包中的方法,比如ActionSupport,然后在eclipse中按快捷键F3                        java  API -   F1
    3、由于没有导入源文件,所以在打开的文件中会出现 change attached source的按钮
    4、点击这个按钮,在打开的对话框中选择  点击 external file..
    5、选择源包即可。

    当然以上你的保证src包是和导入的jar包相比配的。

    说明下我导入的是webwork-2.2.7.jar 及 webwork-src-2.2.7.jar 

    4.怎样让eclipse给出xml文档提示呢?  (定义文档dtd位置)

    找到struts2 - core .jar,解压开,找到struts-2.dtd文件

     顺序 : window - perference - xml catalog(可以手动搜索) - add - 上面dtd文件

    5.之所以这些框架开始感觉麻烦,还不如直接访问,是因为易于以后的扩展(设计模式一般都是简单问题复杂化)。

    struts就是把请求和展现(最后的结果)分开。

    6.nameSpace :

    <struts>

    <constant name="struts.devMode" value="true" />
        <package name="front" extends="struts-default" namespace="/front">
            <action name="index">
                <result>/Namespace.jsp</result>                        <rusult   name = "success">里面为success的话就可以不写
            </action>
        </package>          name="front" 用来区分重名的情况   namespace必须斜杠开头  一般都以模块命名
    </struts>

    namespace决定了action的访问路径,默认为"",可以接收所有路径的action

    namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,
    /xxx/index.action,或者/xxx/yyy/index.action.<br/>
    namespace最好也用模块来进行命名

    namespace不写  或者为空  不管怎么访问都能访问到。如下:

     <package name="main" extends="struts-default" namespace="">
            <action name="index">
                <result>/Namespace.jsp</result>
            </action>
        </package>

    找不到的都到里面找 。

    7. <constant name="struts.devMode" value="true" />
        <package name="front" extends="struts-default" namespace="/">
            <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
                <result name="success">/ActionIntroduction.jsp</result>
            </action>
        </package>
    当我们action不配class时 ,是默认的class,即ActionSupport 。 import com.opensymphony.xwork2.ActionSupport 。

    真正开发只用 ActionSupport 。 继承ActionSupport 。
    8 .路径问题的说明 :

    当找不到对应的namespace路径时,会访问web.xml里面的默认路径。

    相对路径 : 查找同目录上一层目录 : ../    上两层目录 .. .. /   

    1) 

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>                                              localhost                              8080                                           项目名                     namespace

    2)

    myEclipse可以加上 <base href="<%=basePath%>" />  就是所有的路径默认加上namespace的路径。

    struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

    虽然可以用redirect方式解决,但redirect方式并非必要。
    解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
    或者使用myeclipse经常用的,指定basePath。

    9.  method  动态方法调用 (DMI)

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" extends="struts-default" namespace="/user">
            <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
                <result>/user_add_success.jsp</result>
            </action>
           
            <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
                <result>/user_add_success.jsp</result>
            </action>    用这种 ,用动态的。
        </package>
    </struts>
    Action执行的时候并不一定要执行execute方法<br />
    可以在配置文件中配置Action的时候用method=来指定执行哪个方法
    也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />
     <a href="<%=context %>/user/userAdd">添加用户</a>
     <br />
     <a href="<%=context %>/user/user!add">添加用户</a>
     <br />
    前者会产生太多的action,所以不推荐使用

    10 。ActionWildcard :通配符。  视频14

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="actions" extends="struts-default" namespace="/actions">
            <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
                <result>/Student{1}_success.jsp</result>
            </action>
            *为通配符 , {1} ,就是*代表的内容 。  用这种的 。
            <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
                <result>/{1}_{2}_success.jsp</result>
                <!-- {0}_success.jsp -->
            </action>
        </package>
    </struts>     精简化  :项目中约定优于配置 。

    当有几个action都匹配时,struts会匹配最精确的 。如果*都能配置 ,就会按照顺序 。

    11.用action属性接受参数 :<a href="user/user!add?name=a&age=8">  name  、age必须在action里面是成员变量,提供get、set方法,类型自动转换。

    12.用DomainModel接受参数(域模型) 真正纯在的实体概念:<a href="user/user!add?user.name=a&user.age=8">添加用户</a>

     DTO :比如说,密码确认。   视频16 。

    public class UserDTO {
     private String name;
     private String password;
     private String confirmingPassword;
    }

    13. ModelDriven   不常用 : MVC思想 ,这里面user被认为是一个model,必须new一个user 。

    public class UserAction extends ActionSupport implements ModelDriven<User>{
     
     private User user = new User();
     
     public String add() {
      System.out.println("name=" + user.getName());
      System.out.println("age=" + user.getAge());
      return SUCCESS;
     }

     @Override
     public User getModel() {
      return user;
     }
     
    }

    14. 版本的中文问题 :   在struts里面加上  <constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->

         去哪里查struts的文档呢? :官网啊~~~

    struts2  2.1.6有bug解决不了中文问题 ,只能在web.xml里面配  ,或者在spring的filter里面配置。

     web.xml 配置 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>改成struts2的2.1.7的配置

    15. 简单数据验证 : 视频19 ,项目11 。   <%@taglib uri="/struts-tags" prefix="s" %>

    jsp页面最后写了<s:debug></s:debug>   会在页面出现很多链接 。

    栈 :先进后出  堆 :先进先出 。  

    ognl表达式 : <s:property value="errors.name[0]"/>   取属性 ,得到结果 “name is error”,debug里面value Stack Contents能看到可以取的属性 。

    key的value 是一个数组。

    <s:property value="errors"/>  得到的结果是 "name = name is error "    

    <body>
     User Add Error!
     <s:fielderror fieldName="name" theme="simple"/> <!-- 默认是xhtml--> 
     <br />  
     <s:property   value="errors.name[0]"/>
     <s:debug></s:debug>
    </body>两种error方法  ,第二种好,可以改css,第一种封装好了 。

     16.Struts访问web元素 :  视频21

    一个form里的4个button通过不同的action提交方式 :

    <form name="f" action="" method="post">
    用户名:<input type="text" name="name"/>
    密码:<input type="text" name="password"/>
    <br />
    <input type="button" value="submit1" οnclick="javascript:document.f.action='login/login1';document.f.submit();" />
    <input type="button" value="submit2" οnclick="javascript:document.f.action='login/login2';document.f.submit();" />
    <input type="button" value="submit3" οnclick="javascript:document.f.action='login/login3';document.f.submit();" />
    <input type="button" value="submit4" οnclick="javascript:document.f.action='login/login4';document.f.submit();" />
    </form>

     只用IOC :

    public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
     
     private Map<String, Object> request;
     private Map<String, Object> session;
     private Map<String, Object> application;
     
     //DI dependency injection
     //IoC inverse of control
     public String execute() {
      request.put("r1", "r1");
      session.put("s1", "s1");
      application.put("a1", "a1");
      return SUCCESS;
     }

     @Override
     public void setRequest(Map<String, Object> request) {
      this.request = request;
     }

     @Override
     public void setSession(Map<String, Object> session) {
      this.session = session;
     }

     @Override
     public void setApplication(Map<String, Object> application) {
      this.application = application;
     }
     页面部分 (取值)

    <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
     <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
     <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
     <s:property value="#attr.a1"/><br />
     <s:property value="#attr.s1"/><br />
     <s:property value="#attr.r1"/><br />
     
    }

    17 .

    <struts>
        <constant name="struts.devMode" value="true" />
        <include file="login.xml" />
    </struts>              直接把login.xml包进来 。   意义在于 ,项目组中不同的模块包含进来,公用模块写在struts.xml里面

    18.default action :   项目14  视频24

     <default-action-ref name="index"></default-action-ref> 项目名字后面没有或者加其他的都跳到index的action

     

    19 . result的配置 : type跳转的方式

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="resultTypes" namespace="/r" extends="struts-default">
         <action name="r1">
          <result type="dispatcher">/r1.jsp</result>   只能跳转到视图     服务器端跳转
         </action>
        
         <action name="r2">
          <result type="redirect">/r2.jsp</result>     只能跳转到视图   客户端跳转
         </action>
        
         <action name="r3">
          <result type="chain">r1</result>      跳转到action   访问同一个包或者另外一个包的action    类似于forward
        <!--<result type="chain">p2/r1</result>  -->  另一个包p      都不要加斜杠    

      </action>

    上面不行的时候用下面的:
         
         <action name="r4">
          <result type="redirectAction">r2</result>       跳转到action
         </action>
        
        </package>
    </struts>

    2)Global_Result   全局结果集     视频30   项目16

     想用另外一个包里面的result :用extends

      <package name="admin" namespace="/admin" extends="user">               extends
         <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
          <result>/admin.jsp</result>
         </action>
        </package>

     20.动态结果集 : 视频31

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" namespace="/user" extends="struts-default">
         <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
          <result>${r}</result>
         </action>    
        </package>          struts里面的ognl表达式  不是el表达式
      </struts>

    public String execute() throws Exception {
      if(type == 1) r="/user_success.jsp";
      else if (type == 2) r="/user_error.jsp";
      return "success";
     }
    21.带参数的结果集 :  项目18   视频32    只有在redirect情况下才要传参数 ,forward不要。
     一次request只有一次值栈 ,forward共享同一个值栈 。

    向结果传参数
    <ol>
     <li><a href="user/user?type=1">传参数</a></li>
    </ol>   index.jsp

    <struts>
        <constant name="struts.devMode" value="true" />
        <package name="user" namespace="/user" extends="struts-default">
         
         <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
          <result type="redirect">/user_success.jsp?t=${type}</result>
         </action>    
        </package>
       </struts>

    <body>
     User Success!
     from valuestack: <s:property value="t"/><br/>       因为不是forward ,所以这样取不到值的 。不在值栈里面,因为user_success
    只有jsp,没有从action类中取值,没有action user_success。所以只能<s:property value="#parameters.t"/>这样取值。
     from actioncontext: <s:property value="#parameters.t"/>
     <s:debug></s:debug>
    </body>

     22.OGNL (Object Graph Navigation Language) 表达式 :  视频 36-43    项目19   重要!

        不是标签  是标签里面的value

     user.xxx只有传 ,才会构造 。  想初始化domain model ,可以自己new ,也可以传参数值,

    但这时 domain Model必须有一个参数空的构造方法 。

        get/set生成的位置不对,怎么办 ?  -> 右键source -  sort member  - sort all member .

    <body>
     <ol>
      <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
      <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
      <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
      <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
      <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
      <li>访问值栈中action的普通方法:<s:property value="m()" /></li>
      <hr />
      <li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
      <li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
      <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
      <hr />
      <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
      <hr />
      <li>访问List:<s:property value="users"/></li>
      <li>访问List中某个元素:<s:property value="users[1]"/></li>
      <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
      <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
      <li>访问Set:<s:property value="dogs"/></li>
      <li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
      <li>访问Map:<s:property value="dogMap"/></li>
      <li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
      <li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
      <li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
      <li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
      <hr />
      <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>                  过滤
      <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>         ^  表示第一个
      <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
      <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
      <hr />

       <li>[]:<s:property value="[0"/></li>      在debug模式上方的stack   栈里面 从上往下全部取出来 。
      <li>[]:<s:property value="[0].username"/></li>      
       </ol>
     <s:debug></s:debug> 
    </body>

     访问集合 :视频 40    toString也在里面 。set里面没有顺序 ,所以去set里面的第几个取不到。

     23 .struts 标签:       视频 44 - 52  重要 !  项目20

    要想把一个object转换成一个字符串 就在双引号里面加单引号

    <li>property: <s:property value="username"/> </li>
      <li>property 取值为字符串: <s:property value="'username'"/> </li>

    <li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>    取不到用默认值 取到用admin

    <li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>    escape默认为true  不会转换html   打印出<hr/>

    <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li>
      
      <li>set 从request取值: <s:property value="#request.adminName" /></li>
      <li>set 从ActionContext取值: <s:property value="#adminName" /></li>
      
      <%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
      <li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>
      --%>
      <li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/></li>
      <li>set 使用#取值: <s:property value="#adminPassword"/> </li>
      <li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
      
      Chr />
      
      <%--<li>push:<s:set name="myDog" value="new com.bjsxt.struts2.ognl.Dog('oudy')"></s:set></li>
      <li>
      push:<s:push value="#myDog">
       <s:property value="name"/>
      </s:push>
      </li>
      <li>push: <s:property value="name"/></li>
      --%>
      <hr />
      <li>bean 定义bean,并使用param来设定新的属性值:
       <s:bean name="com.bjsxt.struts2.tags.Dog" >
        <s:param name="name" value="'pp'"></s:param>
        <s:property value="name"/>               必须在bean标签里面访问    var是可以在bean外面访问的  因为放到了actioncontext里面


       </s:bean> 
      </li>
      <li>bean 查看debug情况:
       <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
        <s:param name="name" value="'oudy'"></s:param>                     注意双引号里面的单引号
       </s:bean>
       拿出值:
       <s:property value="#myDog.name"/>
      </li>
      <hr />

    完全可以不用  ,因为struts里面的include中文出来比较麻烦 ,用jsp中的两种include
      <li>include _include1.html 包含静态英文文件
      <s:include value="/_include1.html"></s:include>
      </li>
      <li>include _include2.html 包含静态中文文件
      <s:include value="/_include2.html"></s:include>
      </li>
      <li>include _include1.html 包含静态英文文件,说明%用法
      <s:set var="incPage" value="%{'/_include1.html'}" />
      <s:include value="%{#incPage}"></s:include>            说明%用法             
      </li>   

    总结  :$#%的区别 :

    a)$用于i18n和struts配置文件

    b)#取得ActionContext的值

    c)%将原本的文本属性解析为ognl,对于本来就是ogni的属性不起作用(但是也可以加上),有的value的属性的string,加上%就变成ognl.

                 i  ,参考<s:property 和 <s:include


    # 1.用于actionContext  取值 ()  2. url传入的值, 用#取值  3.%{#include}  


    24 .控制标签 :

      <li>if elseif else:
      age = <s:property value="#parameters.age[0]" /> <br />
      <s:set var="age" value="#parameters.age[0]" />
      <s:if test="#age < 0">wrong age!</s:if>
      <s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>                 //age是一个集合  必须加数组下标。
      <s:else>yeah!</s:else><br />
      <s:if test="#parameters.aaa == null">null</s:if>
      </li>
      <hr />
      <li>遍历集合:<br />
      <s:iterator value="{1, 2, 3}" >
       <s:property/> |               自动拿元素
      </s:iterator>
      </li>
      <li>自定义变量:<br />
      <s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
       <s:property value="#x.toUpperCase()"/> |
      </s:iterator>
      </li>
      <li>使用status:<br />
      <s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">             记录当前的状态
       <s:property/> |
       遍历过的元素总数:<s:property value="#status.count"/> |
       遍历过的元素索引:<s:property value="#status.index"/> |
       当前是偶数?:<s:property value="#status.even"/> |
       当前是奇数?:<s:property value="#status.odd"/> |
       是第一个元素吗?:<s:property value="#status.first"/> |
       是最后一个元素吗?:<s:property value="#status.last"/>
       <br />
      </s:iterator>
      </li>
      <li>
      <s:iterator value="#{1:'a', 2:'b', 3:'c'}" >           定义map的时候要加#
       <s:property value="key"/> | <s:property value="value"/> <br />
      </s:iterator>
      </li>
      <li>
      <s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
       <s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
      </s:iterator>
      </li>
      <li>
      <s:fielderror fieldName="fielderror.test"theme="simple"></s:fielderror>  
      </li>

    截元素:从第三个 截13个 。 

     <s:subset    source = "myList"  count = "13"  start = "3">]

              <s:iterator>

                      <s:propery/>

              </s:subset>          

    <struts>

    theme : 

         <constant name="struts.devMode" value="true" />
        <constant name="struts.ui.theme" value="css_xhtml" />
     <package name="theme" extends="struts-default">

            <action name="theme" class="com.bjsxt.struts2.theme.ThemeAction">
                <result>/theme.jsp</result>
            </action>

        </package>

    </struts>

    25. 视频52  改变struts2的默认的filedError的theme 的几种方法 .

    项目2100  1、2、3、4

    只有fiedError会比较麻烦,其他标签struts2不会对它添加其他的属性 。

     26.  <package name="front" namespace="/" extends="struts-default" >
           <default-action-ref name="index"/>   <!-- bug!!! -->
       
           <action name="index" class="com.bjsxt.bbs2009.action.CategoryAction" method="list">
             <result>/index.jsp</result>
           </action>   
        </package>

     27.声明式的异常处理 :     项目30-07   视频66

    public List<Category> list() throws SQLException {
      Connection conn = DB.createConn();
      String sql = "select * from _category_";
      PreparedStatement ps = DB.prepare(conn, sql);
      List<Category> categories = new ArrayList<Category>();
      try {
       ResultSet rs = ps.executeQuery();
       Category c = null;
       while(rs.next()) {
        c = new Category();
        c.setId(rs.getInt("id"));
        c.setName(rs.getString("name"));
        c.setDescription(rs.getString("description"));
        categories.add(c);
       }
      } catch (SQLException e) {
       e.printStackTrace();
       throw(e);                       //throw(e) ;
      }
      DB.close(ps);
      DB.close(conn);
      return categories;
     }

     Struts里面配置异常信息 :      

     <action name="*-*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">
             <result>/admin/{1}-{2}.jsp</result>
             <result name="input">/admin/{1}-{2}.jsp</result>
              <exception-mapping result="error" exception="java.sql.SQLException" /> 
              <result name="error">/error.jsp</result>             //有异常的时候,跳到匹配的result 。

    </action>

     2)可以为所有action配置一个统一的异常 :视频66,

    其它包继承此包,这样出异常统一跳到"/admin/error.jsp

    <constant name="struts.devMode" value="true"></constant>
     <package name="bbs2009_default" extends="struts-default">
      <global-results>
          <result name="error">/admin/error.jsp</result>
         </global-results>     
       <global-exception-mappings>
          <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
         </global-exception-mappings>    
     </package>

     28.国际化 :视频69  项目3100           ResourceBundle这个类 
    public class Test {
     public static void main(String[] args) {
      ResourceBundle res = ResourceBundle.getBundle("app", Locale.CHINA);
      System.out.println(res.getString("welcome.msg" ));
     }

    app_zh_CN.properties

    app_en_US.properties      

    转换工具 :PropertiesEditor 插件

    features plugin覆盖到myeclipse中的eclipse目录里。
    29 . Struts2  I18N action级别I18N问题 :   视频71 :  项目 32

    <constant name="struts.custom.i18n.resources" value="bbs2009"></constant>   bbs2009为properties默认前缀名

    <body>
      <form action="admin/Login-login" method="post">
       <s:property value="getText('login.username')"/> <input name="username" />
       <s:property value="getText('login.password')"/><input name="password" type="password" />
       <input type="submit" value="<s:property value="getText('login.login')"/>" />
      </form>
      <s:debug></s:debug>
      <a href="admin/lang?request_locale=en_US">en</a>
      <a href="admin/lang?request_locale=zh_CN">cn</a>
      </body>

     第二种: 出来资源文件中的参数  视频72  项目32

    <body>
     <s:text name="welcome.msg">
      <s:param value="username"></s:param>
     </s:text>  
      </body>

    welcome.msg=welcome:{0}可以 

    中英文切换  视频73  项目 32

     <constant name="struts.custom.i18n.resources" value="bbs2009"></constant>

     http://localhost:8080/struts2_3200_BBS2009_08_I18N/admin/lang?request_locale=en_US  

    http://localhost:8080/struts2_3200_BBS2009_08_I18N/admin/lang?request_locale=zh_CN        后面传参必须这么写(request_locale=zh_CN), 就是这样解析的

    30.源码解析 : 视频 75  项目 36

    31.防止重复提交 :
      <action name="user" class="com.bjsxt.action.UserAction">
       <result>/addOK.jsp</result>
       <interceptor-ref name="defaultStack"></interceptor-ref>
       <interceptor-ref name="token"></interceptor-ref>//防止重复提交
       <result name="invalid.token">/error.jsp</result>    //重复提交的错误结果页面(“严谨做重复的事”)      

    </action>

    32.拦截器:视频76-79 

    http默认传String类型

    关键问题是字符串转其他类型 :比如说Date            视频80  项目37

     <body>
       name:<s:property value="name"/><br/>
       age:<s:property value="age"/><br/>
       date:<s:property value="d"/><br/>
       <s:date name="d" format="yyyy/MM/dd HH:mm:ss"/><br/>             //时间的专门表达式
       <s:property value="interests"/><br/>
       <s:property value="users"/><br/>
       <s:property value="p"/><br/>
       <s:property value="ps"/><br/>
       points:<s:property value="points"/><br/>  
      </body>

    关于Point类的转换 视频 81- 82  项目37 

     

     

     

     

     

     

     

     


    展开全文
  • JsonCpp的基本用法

    万次阅读 多人点赞 2019-03-12 21:55:19
    是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。 JsonCpp(1.8.4版本):htt...

    1、JsonCpp
    C++库,允许操作JSON值,包括与字符串串行化和序列化。它可在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的便捷方式。是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。
    JsonCpp(1.8.4版本):https://github.com/open-source-parsers/jsoncpp/tree/1.8.4

    2、JsonCpp编译工具
    (1)Cmake
    是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
    (2)Mesos
    scons:Python写的自动化构建工具,是一个更简便,更可靠,更高效的编译软件,可用于编译jsoncpp。
    (3)Doxygen
    用于带注释的C++源生成文档的事实上的标准工具。程序的文件产生工具,可将程序中的特定注释转换为说明文件。能依据程序本身的结构,将注释经过处理重新整理成为一个纯粹的参考手册。
    3、JsonCpp编译
    除了使用以上工具编译外,还可以使用visual studio编译。
    (1)用VS打开jsoncpp-1.8.4\makefiles\vs71 /jsoncpp.sln 便可以开始编译。
    (2)打开vs2013 点击项目lib_json右键-属性-C/C++ -代码生成 选择多线程调试(MTD)
    (3)调试修改为 debug右键按下鼠lib_json 选择生成,则在jsoncpp-1.8.4\build\vs71\debug\lib_json生成json_vc71_libmtd.lib(注意最后为libmtd)。vs2013自动编译项目。(如果为release,则相对于生成releas版本为json_vc71_libmt.lib(最后为libmt))
    在这里插入图片描述
    (4)编译后在jsoncpp-1.8.4\build\vs71\release\lib_json找到json_vc71_libmtd.lib将其复制到vs工程的的lib里(即直接复制到项目中)
    在这里插入图片描述
    (5)在项目中右击—配置—配置属性—C/C++ --代码生成—运行库—多线程(/MTD)(注意与上面的lib的生成版本有关,要改为对应的形式)
    在这里插入图片描述
    (6)在项目中右击—配置—配置属性–链接器–输入—附加依赖项,最后添加json_vc71_libmtd.lib,(或者在cpp源代码中添加#pragma comment(lib, “json_vc71_libmtd.lib”))
    在这里插入图片描述
    (7)将jsoncpp的头文件include复制到vs的include.,并在项目中引入,然后就可以使用了
    在这里插入图片描述
    4、JsonCpp基础
    jsonCpp主要包含三种类型的class:value、reader、write。jsonCpp总所有对象、类名都在namespace json中,使用时只要包含json.h即可。
    (1)Json::Value
    Json::Value时jsonCpp中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。
    例:

    Json::Value root;
    root["status"] = 1;			//新建一个key为status,赋予数值1
    root["message"] = "OK";		//新建一个key为message,赋予字符串OK
    root["array"].append("arr"); //新建一个key为array,类型为数组,对第一个元素赋值为字符串“arr”
    root["array"].append(1234);  // 为数组 key_array 赋值,对第二个元素赋值为:1234。
    Json::ValueType type = root.type();	//获得root的类型
    

    注:a、跟C++ 不同,JavaScript 数组可以为任意类型的值,所以 jsoncpp 也可以。
    jsoncpp 还有一些其他同能,比如说设置注释、比较 json 大小、交换 json 对象等
    b、在把value插入值后再输出来,输出的值是按字母表的顺序排列。
    c、Json::ValueType:value的类型,是一个枚举型

    enum ValueType {
      nullValue = 0, ///< 'null' value
      intValue,      ///< signed integer value
      uintValue,     ///< unsigned integer value
      realValue,     ///< double value
      stringValue,   ///< UTF-8 string value
      booleanValue,  ///< bool value
      arrayValue,    ///< array value (ordered list)
      objectValue    ///< object value (collection of name/value pairs).
    };
    

    (2)Json::Writer
    a、Json::Writer负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。
    b、Json::Writer是一个纯虚类,不能直接使用,一般使用Json::Writer的子类:Json::FasterWriter, Json::StyledWriter、Json::StyledStreamWriter
    注:在新版中Json::FasterWriter, Json::StyledWriter、Json::Reader都被弃用,替代的是Json::StreamWriterBuilder、Json::CharReaderBuilder
    c、Json::FasterWriter:速度最快
    d、Json::StyledWriter:格式化后的json

    (3)Josn::Reader
    用于读取,准确说是用于将字符串或者文件输入流转换为Json::Value对象的。
    parse()
    a、使用Json::Reader对json文件进行解析
    bool parse(const std::string& document, Value& root, bool collectComments = true);
    参数:document: 包含要读取的文档的UTF-8编码字符串
    root:(输出)Json::Value的对象

    b、使用Json::Reader对json输入流(文件)进行解析
    bool parse(std:stream& is, Value& root, bool collectComment = true);

    c、使用Json::Reader对字符串进行解析
    bool parse(const char* beginDoc, const char* ednDoc, Value& root, bool collectComment = true);

    (4)JsonCpp其他操作
    a、判断key是否存在
    bool Json::Value::isMember ( const char * key) const;
    存在返回1,否则返回0

    b、判断是否为null成员函数
    注:Json::Value和C++中的map有一个共同的特点,就是当你尝试访问一个不存在的 key 时,会自动生成这样一个key-value默认为null的值对。

    c、得到所有成员
    typedef std::vectorstd::string Json::Value::Members;
    Value::Members Json::Value::getMemberNames ( ) const;
    该函数的类型为一个string的vector。

    d、删除成员
    Value Json::Value::removeMember( const char* key)
    返回删除的值,或者null

    5、测试实例

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "json/json.h"
    
    using namespace std;
    
    int main()
    {
    	const char* age;
    	Json::Value root;
    	Json::FastWriter fast_writer;
    	Json::StyledWriter style_writer;
    	Json::StyledStreamWriter stream_writer;
    	Json::Reader reader;
    	Json::Value json_object;
    
    	root["null"] = NULL;			//注意此处在输出是显示为0,而非null
    	root["message"] = "OK";
    	root["age"] = 52;
    	root["array"].append("arr");	// 新建一个key为array,类型为数组,对第一个元素赋值为字符串“arr”
    	root["array"].append(123);		// 为数组 key_array 赋值,对第二个元素赋值为:1234
    
    	Json::ValueType type = root.type();				//root的类型
    
    	cout << root.toStyledString() << endl;			//格式化输出
    	cout << "root_type:" <<type << endl;			//类型为7,即为类型为对象
    
    	// 写到本地文件
    	cout << "快速输出:" << endl;
    	string str = fast_writer.write(root);
    	cout << str << endl;		//快速输出,紧凑型
    	ofstream ofs("fast_writer.json");
    	ofs << str;
    	ofs.close();
    
    	cout << "格式化输出:" << endl;
    	str = style_writer.write(root);
    	cout << str << endl;		//格式化输出,排版型
    	ofs.open("style_writer.json");
    	ofs << str;
    	ofs.close();
    
    
    	// 对字符串解析
    	//const char* json_document = "{\"age\" : 12, \"name\" : \"weng\"}";
    	string json_document = "{\"age\" : 123, \"name\" : \"weng\"}";
    	if (!reader.parse(json_document, json_object)){
    		cout << "error" << endl;
    		return 0;
    	}
    	else{
    		cout <<"age:" <<json_object["age"] << " name" << json_object["name"] << endl;
    	}
    	
    	// 对文件解析
    	ifstream ifs("E:\\demo\\JsonTest\\JsonTest\\example.json", ios::binary);
    	if (!reader.parse(ifs, json_object)){
    		cout << "open error" << endl;
    		ifs.close();
    	}else{
    		cout << "encoding:" << json_object["encoding"].asString() << endl;
    		cout << "age:" <<json_object["age"].asInt() << endl;
    		int num = json_object["plug"].size();
    		for (int i = 0; i < num; i++){
    			cout << json_object["plug"][i].asString() << " ";
    		}
    		ifs.close();
    		cout << endl;
    	}
    
    	// 判断key是否存在
    	bool is_age =  root.isMember("age");
    	cout << "isMember:" <<is_age << endl;
    
    	// 判断是否为null
    	//bool is_null = root["null"].isNull();			//注意此处被赋值为0,而非null
    	bool is_null = json_object["null"].isNull();
    	cout << "is_null:" << is_null << endl;
    
    	// 得到所有的key
    	for (auto elem : root.getMemberNames()){
    		cout << elem << " ";
    	}
    	cout << endl;
    
    	// 删除成员
    	cout << "remove_age:" << root.removeMember("age") << endl;
    
    
    	system("pause");
    	return 0;
    }
    
    展开全文
  • 相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资...
  • joc eclipse plugin

    2007-03-05 14:11:12
    相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资...
  • 利用输入法注入DLL

    2013-05-19 22:45:22
    Ring3下注入DLL的另类方法,能过杀软和游戏NP(源码) 注入DLL是做全局钩子或者拦截类软件都有可能用到的技术,如果做外挂的话我们也有 可能需要注入一个DLL到游戏进程中去干点什么“坏事”。 但我们知道现在要...
  • 11.9 把sfilter编译成静态库 243 11.9.1 如何方便地使用sfilter 243 11.9.2 初始化回调、卸载回调和绑定回调 244 11.9.3 绑定与回调 245 11.9.4 插入请求回调 246 11.9.5 如何利用sfilter.lib 249 第12章 文件...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • 7.9 把sfilter编译成静态库 212 7.9.1 如何方便地使用sfilter 212 7.9.2 初始化回调、卸载回调和绑定回调 213 7.9.3 绑定与回调 215 7.9.4 插入请求回调 216 7.9.5 如何利用sfilter.lib 218 本章的示例代码 221 练习...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    J2C 将 Java 代码转 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    J2C 将 Java 代码转 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • Java资源包01

    2016-08-31 09:16:25
    J2C 将 Java 代码转 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包101

    2016-07-13 10:11:08
    J2C 将 Java 代码转 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

反编译lib成源码