-
使用exe4j制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码
2009-04-25 20:21:581. 使用exe4j和instal制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码,首先使用exe4j先把自己的文件打包成test.exe.我这里打包的是自己的一个工程,其中之一个工程也包括lib包.现在就把我自己的... -
改良版的json-lib2.4
2012-03-08 17:05:15大家都知道jsonlib2.4之后有了属性过滤的功能,就是当把一个bean转成json的时候能指定哪些属性输出...大家可以反编译了看看。这个改良包我用了一年多了,源码找不着了。好像就新加了这一个类。最近缺分了,发上来攒点。 -
jocky 混肴编译rar包(ant和插件俩个版本)
2013-01-22 19:22:24相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资... -
JAVA上百实例源码以及开源项目
2016-01-03 17:37:40有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码加以改进做成小工具。 Java右键弹出... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、... -
Windows内核安全与驱动开发光盘源码
2015-07-11 11:56:2811.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:001. 使用exe4j和instal制作发布包,使用打包后看不到jar文件,别人也就无法反编译你的源码,首先使用exe4j先把自己的文件打包成test.exe.我这里打包的是自己的一个工程,其中之一个工程也包括lib包.现在就把我自己的...1. 使用exe4j和instal制作发布包,使用打包后看不到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.6的API所以必须在1.6或者更高的版本才能够运行.最主的版本我们可以不写.,设置完成之后,点击下一步.
j.
这里是设置应用程序,就像我们打开netbeaans会出现一个加载界面,直到所以的文件都加载到内存之后,我们才可以使用netbeans IDE。选择图片这后,我们点击下一步,配置文件信息.
这里一般不做修改,直接点击下一步.
点击next就完成了去看一下,去看看你刚才所设置exe文件生成上当吧 这是就是我所打包后的文件。不过这个文件会比较大。它只是一个exe。当在如果你想让它小一些。可以在刚才的第二步中选择”regular mode”这个步骤。不过下面我将要讲用instal4j把它打包成安装包,它做出来之后的效果也很不错。最后只是发送一个图标到桌面上。
下面开始讲如何用instal4j制作安装包:
这是启动界面。你可点击上一次你作保存的工程,所以这里我也就直接点击上一次所作的保存了。
它主要有这些六大块,第一块是生成基本信息,第二块是文件目录信息。你的可执行文件,和其它所必需用到的文件。第三块,是制作一个启动,就是exe文件,第四个是打包界面的相关设计,我这时只是做个简单的安装包,所以安装界面也就不追求漂亮了。
第五步是生成打包程序。第六步是生成。关于instal4j。制作比较简单一些,我在这里也就不多作介绍了,朋友们可以自己研究一下。如有不懂,再联系我。Q:2724015
34
-
关于eclipse查看httpservlet等源代码关联了.jar之后仍然看不到源代码的情况
2016-02-16 22:47:27于是查了一下,发现是因为没有为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:04JsonCpp C++库,允许操作JSON值,包括与字符串...是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下 -
jsoncpp-src-0.5.0-zhp.zip
2020-03-24 10:07:52C++库,允许操作JSON值,包括与字符串串行化和...是一个第三方JSON解析库,可将源码编译成方便使用动态链接库、静态链接库或者静态导入库的。jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。 -
Struts2
2012-12-29 22:02:321 : 配置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.jar4.怎样让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 项目名 namespace2)
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.42、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,否则返回0b、判断是否为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)
返回删除的值,或者null5、测试实例
#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 混淆工具,不可逆 jocky 也许是最好的了
2009-06-12 14:20:28相信每一个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:22Ring3下注入DLL的另类方法,能过杀软和游戏NP(源码) 注入DLL是做全局钩子或者拦截类软件都有可能用到的技术,如果做外挂的话我们也有 可能需要注入一个DLL到游戏进程中去干点什么“坏事”。 但我们知道现在要... -
Windows内核安全驱动开发(随书光盘)
2015-08-02 15:57:4311.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章 文件... -
寒江独钓-Windows内核安全编程(高清完整版).part1
2011-01-04 11:02:597.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part2
2011-01-04 11:04:537.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part7
2011-01-04 11:14:497.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part6
2011-01-04 11:12:347.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part5
2011-01-04 11:09:417.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part4
2011-01-04 11:08:467.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 练习... -
寒江独钓-Windows内核安全编程(高清完整版).part3
2011-01-04 11:07:497.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:34J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用... -
java开源包12
2013-06-28 10:14:45J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用... -
Java资源包01
2016-08-31 09:16:25J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用... -
java开源包101
2016-07-13 10:11:08J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...