??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品嫩草影院在线观看,亚洲精品国产精品乱码在线观看
,亚洲日韩国产精品无码av http://m.tkk7.com/Steven-bot/articles/363841.htmlSteven_bot Steven_bot Tue, 15 Nov 2011 06:43:00 GMT http://m.tkk7.com/Steven-bot/articles/363841.html http://m.tkk7.com/Steven-bot/comments/363841.html http://m.tkk7.com/Steven-bot/articles/363841.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/363841.html http://m.tkk7.com/Steven-bot/services/trackbacks/363841.html $.fn.selectReadOnly=function(){ var tem=$(this).children('option').index($("option:selected")); $(this).change(function(){ $(this).children('option').eq(tem).attr("selected",true); }); } $("select:[readonly='readonly']").selectReadOnly(); // var val = $('input:radio[name = " sex " ]:checked').val(); ]]>归纳一些网上取JAVA路径的方?/title> http://m.tkk7.com/Steven-bot/articles/363839.htmlSteven_bot Steven_bot Tue, 15 Nov 2011 06:35:00 GMT http://m.tkk7.com/Steven-bot/articles/363839.html http://m.tkk7.com/Steven-bot/comments/363839.html http://m.tkk7.com/Steven-bot/articles/363839.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/363839.html http://m.tkk7.com/Steven-bot/services/trackbacks/363839.html 归纳一些网上取JAVA路径的方法: 注明Q如果从ANT启动E序Qthis.getClass().getResource("")取出来的比较怪,直接用JAVA命o行调试就可成功?/span>得到classpath和当前类的绝对\径的一些方?/p>
获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource(""); //先获得本cȝ所在位|,?home/popeye/testjava/build/classes/net/ String path = new File(base.getFile()Q?"……/……/……/"+name).getCanonicalPath(); //可以得?home/popeye/testjava/name
下面是一些得到classpath和当前类的绝对\径的一些方法。你可能需要用其中的一些方法来得到你需要的资源的绝对\径?/p>
1.FileTest.class.getResource("")
得到的是当前cFileTest.class文g的URI目录。不包括自己Q?/p>
如:fileQ?DQ?java/eclipse32/workspace/jbpmtest3/bin/com/test/
2.FileTest.class.getResource("/")
得到的是当前的classpath的绝对URI路径?/p>
如:fileQ?DQ?java/eclipse32/workspace/jbpmtest3/bin/
3.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径?/p>
如:fileQ?DQ?java/eclipse32/workspace/jbpmtest3/bin/
4.FileTest.class.getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径?/p>
如:fileQ?DQ?java/eclipse32/workspace/jbpmtest3/bin/
5.ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径?/p>
如:fileQ?DQ?java/eclipse32/workspace/jbpmtest3/bin/
我推荐用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对\径的URI表示法?/p>
在Web应用E序中,我们一般通过ServletContext.getRealPath("/")Ҏ得到Web应用E序的根目录的绝对\径。这P我们只需要提供相对于Web应用E序根目录的路径Q就可以构徏出定位资源的l对路径?/p>
注意点:
1.量不要使用相对于System.getProperty("user.dir")当前用户目录的相对\径。这是一?span style="color: #008000; ">定时炸弹
Q随时可能要你的命?/p>2.量使用URI形式的绝对\径资源。它可以很容易的转变为URIQURLQFile对象?/p>
3.量使用相对classpath的相对\径。不要用绝对\径。用上面ClassLoaderUtilcȝpublic static URL getExtendResource(String relativePath)Ҏ已经能够使用相对于classpath的相对\径定位所有位|的资源?/p>
4.l对不要使用编码的l对路径。因为,我们完全可以使用ClassLoadercȝgetResource("")Ҏ得到当前classpath的绝对\径?/p>
使用编码的l对路径是完全没有必要的Q它一定会让你ȝ很难看!E序无法移植!
如果你一定要指定一个绝对\径,那么使用配置文gQ也比硬~码要好得多Q?/p>
当然Q我q是推荐你用程序得到classpath的绝对\径来D源的l对路径.
]]> 动态SQL语句--mybatis http://m.tkk7.com/Steven-bot/articles/363460.htmlSteven_bot Steven_bot Thu, 10 Nov 2011 12:34:00 GMT http://m.tkk7.com/Steven-bot/articles/363460.html http://m.tkk7.com/Steven-bot/comments/363460.html http://m.tkk7.com/Steven-bot/articles/363460.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/363460.html http://m.tkk7.com/Steven-bot/services/trackbacks/363460.html 动态SQL语句 有些时候,sql语句where条g中,需要一些安全判断,例如按性别索,如果传入的参数是I的Q此时查询出的结果很可能是空的,也许我们需要参CؓI?Ӟ是查出全部的信息。这是我们可以用动态sqlQ增加一个判断,当参CW合要求的时候,我们可以不去判断此查询条件?br /> 下文均采用mysql语法和函敎ͼ例如字符串链接函数CONCATQ? 源代?a rel="nofollow" >http://limingnihao.javaeye.com/admin/blogs/782190
3.1 if标签 一个很普通的查询Q?/p>
Xml代码 <!-- 查询学生listQlike姓名 --> <select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </select> <!-- 查询学生listQlike姓名 --> <select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </select>
但是此时如果studentName是null或空字符Ԍ此语句很可能报错或查询结果ؓI。此时我们用if动态sql语句先进行判断,如果gؓnull或等于空字符Ԍ我们׃q行此条件的判断?/p>
修改为:
Xml代码 <!-- 查询学生listQlike姓名 --> <select id=" getStudentListLikeName " parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <if test="studentName!=null and studentName!='' "> WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> </select> <!-- 查询学生listQlike姓名 --> <select id=" getStudentListLikeName " parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <if test="studentName!=null and studentName!='' "> WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> </select> 此时Q当studentName的gؓnull?#8217;’的时候,我们q不q行where条g的判断,所以当studentNamegؓnull?#8217;’|不附带这个条Ӟ所以查询结果是全部?/p>
׃参数是Java的实体类Q所以我们可以把所有条仉附加上,使用时比较灵z, new一个这L实体c,我们需要限刉个条Ӟ只需要附上相应的值就会whereq个条gQ相反不去赋值就可以不在where中判断?/p>
代码中的where标签Q请参?.2.1.
Xml代码 <!-- 查询学生listQlike姓名Q?性别?生日?班Q用where,参数entitycd --> <select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> <if test="studentBirthday!=null"> AND ST.STUDENT_BIRTHDAY = #{studentBirthday} </if> <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> AND ST.CLASS_ID = #{classEntity.classID} </if> </where> </select> <!-- 查询学生listQlike姓名Q?性别?生日?班Q用where,参数entitycd --> <select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> <if test="studentBirthday!=null"> AND ST.STUDENT_BIRTHDAY = #{studentBirthday} </if> <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> AND ST.CLASS_ID = #{classEntity.classID} </if> </where> </select> 查询Q姓名中?#8216;?#8217;Q男Q生日在‘1985-05-28’Q班U在‘20000002’的学生?
Java代码 StudentEntity entity = new StudentEntity(); entity.setStudentName("?); entity.setStudentSex("?); entity.setStudentBirthday(StringUtil.parse("1985-05-28")); entity.setClassEntity(classMapper.getClassByID("20000002")); List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity); for( StudentEntity entityTemp : studentList){ System.out.println(entityTemp.toString()); } StudentEntity entity = new StudentEntity(); entity.setStudentName("?); entity.setStudentSex("?); entity.setStudentBirthday(StringUtil.parse("1985-05-28")); entity.setClassEntity(classMapper.getClassByID("20000002")); List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity); for( StudentEntity entityTemp : studentList){ System.out.println(entityTemp.toString()); }
3.2 where、set、trim标签
3.2.1 where 当if标签较多Ӟq样的组合可能会D错误。例如,like姓名Q等于指定性别{:
Xml代码 <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST WHERE <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </select> <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST WHERE <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </select> 如果上面例子Q参数studentName为null?#8217;’Q则或导致此sqll合?#8220;WHERE AND”之类的关键字多余的错误SQL?br /> q时我们可以使用where动态语句来解决。这?#8220;where”标签会知道如果它包含的标{中有返回值的话,它就插入一?#8216;where’。此外,如果标签q回的内Ҏ以AND 或OR 开头的Q则它会剔除掉?br /> 上面例子修改为:
Xml代码 <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </where> </select> <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </where> </select>
3.2.2 set 当在update语句中用if标签Ӟ如果前面的if没有执行Q则或导致逗号多余错误。用set标签可以动态的配置SET 关键字,和剔除追加到条g末尾的Q何不相关的逗号?br />没有使用if标签Ӟ如果有一个参CؓnullQ都会导致错误,如下CZQ?/p>
Xml代码 <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL SET STUDENT_TBL.STUDENT_NAME = #{studentName}, STUDENT_TBL.STUDENT_SEX = #{studentSex}, STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, STUDENT_TBL.CLASS_ID = #{classEntity.classID} WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update> <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL SET STUDENT_TBL.STUDENT_NAME = #{studentName}, STUDENT_TBL.STUDENT_SEX = #{studentSex}, STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, STUDENT_TBL.CLASS_ID = #{classEntity.classID} WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update>
使用set+if标签修改后,如果某项为null则不q行更新Q而是保持数据库原倹{如下示例:
Xml代码 <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL <set> <if test="studentName!=null and studentName!='' "> STUDENT_TBL.STUDENT_NAME = #{studentName}, </if> <if test="studentSex!=null and studentSex!='' "> STUDENT_TBL.STUDENT_SEX = #{studentSex}, </if> <if test="studentBirthday!=null "> STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if> <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' "> STUDENT_TBL.CLASS_ID = #{classEntity.classID} </if> </set> WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update> <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL <set> <if test="studentName!=null and studentName!='' "> STUDENT_TBL.STUDENT_NAME = #{studentName}, </if> <if test="studentSex!=null and studentSex!='' "> STUDENT_TBL.STUDENT_SEX = #{studentSex}, </if> <if test="studentBirthday!=null "> STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if> <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' "> STUDENT_TBL.CLASS_ID = #{classEntity.classID} </if> </set> WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update> 3.2.3 trim trim是更灉|的去处多余关键字的标{,他可以实践where和set的效果?/p>
where例子的等效trim语句Q?/p>
Xml代码 <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <trim prefix="WHERE" prefixOverrides="AND|OR"> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </trim> </select> <!-- 查询学生listQlike姓名Q?性别 --> <select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <trim prefix="WHERE" prefixOverrides="AND|OR"> <if test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </if> <if test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </if> </trim> </select> set例子的等效trim语句Q?/p>
Xml代码 <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL <trim prefix="SET" suffixOverrides=","> <if test="studentName!=null and studentName!='' "> STUDENT_TBL.STUDENT_NAME = #{studentName}, </if> <if test="studentSex!=null and studentSex!='' "> STUDENT_TBL.STUDENT_SEX = #{studentSex}, </if> <if test="studentBirthday!=null "> STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if> <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' "> STUDENT_TBL.CLASS_ID = #{classEntity.classID} </if> </trim> WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update> <!-- 更新学生信息 --> <update id="updateStudent" parameterType="StudentEntity"> UPDATE STUDENT_TBL <trim prefix="SET" suffixOverrides=","> <if test="studentName!=null and studentName!='' "> STUDENT_TBL.STUDENT_NAME = #{studentName}, </if> <if test="studentSex!=null and studentSex!='' "> STUDENT_TBL.STUDENT_SEX = #{studentSex}, </if> <if test="studentBirthday!=null "> STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if> <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' "> STUDENT_TBL.CLASS_ID = #{classEntity.classID} </if> </trim> WHERE STUDENT_TBL.STUDENT_ID = #{studentID}; </update>
3.3 choose (when, otherwise) 有时候我们ƈ不想应用所有的条gQ而只是想从多个选项中选择一个。MyBatis提供了choose 元素Q按序判断when中的条g出否成立Q如果有一个成立,则choosel束。当choose中所有when的条仉不满则时Q则执行 otherwise中的sql。类gJava 的switch 语句Qchoose为switchQwhen为caseQotherwise则ؓdefault?br /> if是与(and)的关p,而choose是或QorQ的关系?/p>
例如下面例子Q同h所有可以限制的条g都写上,斚w使用。选择条g序Qwhen标签的从上到下的书写序Q?/p>
Xml代码 <!-- 查询学生listQlike姓名、或=性别、或=生日、或=班Q用choose --> <select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <choose> <when test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </when> <when test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </when> <when test="studentBirthday!=null"> AND ST.STUDENT_BIRTHDAY = #{studentBirthday} </when> <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> AND ST.CLASS_ID = #{classEntity.classID} </when> <otherwise> </otherwise> </choose> </where> </select> <!-- 查询学生listQlike姓名、或=性别、或=生日、或=班Q用choose --> <select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap"> SELECT * from STUDENT_TBL ST <where> <choose> <when test="studentName!=null and studentName!='' "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%') </when> <when test="studentSex!= null and studentSex!= '' "> AND ST.STUDENT_SEX = #{studentSex} </when> <when test="studentBirthday!=null"> AND ST.STUDENT_BIRTHDAY = #{studentBirthday} </when> <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' "> AND ST.CLASS_ID = #{classEntity.classID} </when> <otherwise> </otherwise> </choose> </where> </select> 3.4 foreach 对于动态SQL 非常必须的,L要P代一个集合,通常是用于IN 条g?br />List 实例?#8220;list”做ؓ键,数组实例?#8220;array” 做ؓ键?/p>
3.4.1参数为list实例的写法: SQL写法Q?/p>
Xml代码 <select id="getStudentListByClassIDs" resultMap="studentResultMap"> SELECT * FROM STUDENT_TBL ST WHERE ST.CLASS_ID IN <foreach collection="list" item="classList" open="(" separator="," close=")"> #{classList} </foreach> </select> <select id="getStudentListByClassIDs" resultMap="studentResultMap"> SELECT * FROM STUDENT_TBL ST WHERE ST.CLASS_ID IN <foreach collection="list" item="classList" open="(" separator="," close=")"> #{classList} </foreach> </select> 接口的方法声明:
Java代码 public List<StudentEntity> getStudentListByClassIDs(List<String> classList); public List<StudentEntity> getStudentListByClassIDs(List<String> classList); 试代码Q查询学生中Q在20000002?0000003q两个班U的学生Q?/p>
Java代码 List<String> classList = new ArrayList<String>(); classList.add("20000002"); classList.add("20000003"); List<StudentEntity> studentList = studentMapper.getStudentListByClassIDs(classList); for( StudentEntity entityTemp : studentList){ System.out.println(entityTemp.toString()); } List<String> classList = new ArrayList<String>(); classList.add("20000002"); classList.add("20000003");
List<StudentEntity> studentList = studentMapper.getStudentListByClassIDs(classList); for( StudentEntity entityTemp : studentList){ System.out.println(entityTemp.toString()); }
3.4.2参数为Array实例的写法: SQL语句Q?/p>
Xml代码 <select id="getStudentListByClassIDs" resultMap="studentResultMap"> SELECT * FROM STUDENT_TBL ST WHERE ST.CLASS_ID IN <foreach collection="array" item="ids" open="(" separator="," close=")"> #{ids} </foreach> </select> <select id="getStudentListByClassIDs" resultMap="studentResultMap"> SELECT * FROM STUDENT_TBL ST WHERE ST.CLASS_ID IN <foreach collection="array" item="ids" open="(" separator="," close=")"> #{ids} </foreach> </select>
接口的方法声明:
Java代码 public List<StudentEntity> getStudentListByClassIDs(String[] ids); public List<StudentEntity> getStudentListByClassIDs(String[] ids);试代码Q查询学生中Q在20000002?0000003q两个班U的学生Q?/p>
Java代码 String[] ids = new String[2]; ids[0] = "20000002"; ids[1] = "20000003"; List<StudentEntity> studentList = studentMapper.getStudentListByClassIDs(ids); for( StudentEntity entityTemp : studentList){ System.out.println(entityTemp.toString()); }
]]> eclipse最佌|?/title> http://m.tkk7.com/Steven-bot/articles/363264.htmlSteven_bot Steven_bot Wed, 09 Nov 2011 02:16:00 GMT http://m.tkk7.com/Steven-bot/articles/363264.html http://m.tkk7.com/Steven-bot/comments/363264.html http://m.tkk7.com/Steven-bot/articles/363264.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/363264.html http://m.tkk7.com/Steven-bot/services/trackbacks/363264.html 讄工作I间的项目编? 防止出现q Window - Preferences - General - Workspace ?Text file encoding"选ؓ"Other" - "UTF-8" 改变现有目的编码的步骤: 叛_目属? 选择"Text file encoding"的编?nbsp; 讄其它文g的编?nbsp; Window -> Preferences -> General -> Content Types 需要设|的文g讄~码, 最好统一设ؓUTF-8 讄? 如Javascript文g可正常显CZ?nbsp; 讄创徏JSP面?JSP的默认编码设为UTF-8 Window -> Preferences -> MyEclipse -> Files and Editors -> JSP ?Encoding"选ؓ"ISO10646/Unicode(UTF-8) L格式化JSP旉面中的空?nbsp; Window -> Preferences -> MyEclipse -> HTML -> HTML Source N?Clear all blank lines" 增强Eclipse的自动代码提C功?nbsp; 默认? 只有?."?Alt + /"才出C码提C功? 不够强大, 作小设|? 可将代码提示功能像VS的一h?nbsp; 1. Window -> Preferences -> Java -> Editor -> Content Assist 2. ?Auto Activation triggers for java"讄?.abc"(默认?."), ?Apply"应用 3. 导出目前的Eclipse配置文g: File -> Export -> General -> Perferences, 选择保存路径, 保存得到*.epf文g 4. 用文本编辑器打开刚才保存?.epf文g, 搜烦".abc", ?.abc"部分改ؓ ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ(," (以上动提C的触发字符, Ҏ个h习惯讄), 保存此配|文?个h觉得不太好用Q容易出? 5. 导入此配|文? File -> import -> General -> Perferences, 导入修改后的配置文g. W一个选项为反应时?可设?00左右(默认200) 高亮cM同一引用的用位|?nbsp; Window -> Perferences -> General - > Editors -> TextEditors -> Annotations 选择"Occurrences",勑ּ"Text as" -> "Highlighted"(块高??Squiggles"(虚线) Link with Editor 打开cd, 自动在包理器这里显C类的位|?nbsp; 取消Myeclipse的自动文仉?卡傻的原? Windows –> Perferences –>Myeclipse –> Validation 保留manual(手动)部分Qbuild下只?classpath dependency Validator" 手动验证: 右键文g -> Myeclipse -> Run Validation 取消拼写错误?nbsp; 我爱故意写错单词, 不需要系l帮我检?nbsp; Windows –> perferences –> General –> Editors-> Text Editors -> Spelling L"Enable spell checking"N?nbsp; 关闭不需要的启动?nbsp; MyEclipse: Windows –> Perferences–> General–> Startup and Shutdown 我只保留?nbsp; 序下来: 1, Tomcat6: 必备?.. 2, 内存监视? 可以查看Myeclipse的用内? 我喜Ƣ这工具(在菜单Myeclipse - Utilities - Show Heap Status打开) 3, JSP Debug工具, 其实我也没用q? 怕有一天用?.. 4, 文g创徏向导(个hl常用到) 5, 向后兼容的意思吧, 怕有一天会用到, 但其实很用, 可去?nbsp; 6, 透视? 应该可以L?.. 其实只用选择Tomcat6 关闭自动更新 1, Eclipse: Windows –> Perferences–> Install/Update -> Automatic Updates 不勾?Automatically find new updates and notify me" 2, Myeclipse: 1)Windows –> Perferences–> MyEclipse... -> Community Essentials &nb sp; 不勾?Search for new features at startup" 2)Windows –> Perferences–> MyEclipse... -> Maven4MyEclipse 不勾?Download repository index updates on startup" W一Q给MyEclipse 8.x Stable (8.0 GA) d启动画面 在myeclipse.ini配置文gq加上一行代? - Dosgi.splashLocation=../Common/plugins/com.genuitec.myeclipse.product8_8.0.0.me200911192201/sp lash.bmp W二Q让Eclipse拖着myeclipse狂飚 技巧一Q取消自动validation validation有一堆,什么xml、jsp、jsf、js{等Q我们没有必要全部都去自动校验一下,只是需要的时?nbsp; 才会手工校验一下,速度立马提升好几个档ơ! 取消ҎQ?nbsp; windows-->perferences-->myeclipse-->validation 除开Manual下面的复选框全部选中之外Q其他全部不?nbsp; 手工验证ҎQ?nbsp; 在要验证的文件上Q单击鼠标右?->myeclipse-->run validation W三QMyEclipse耗内存的决绝办法 1 老是弹出Quick update error q个问题的解军_法是关闭自动更新 Windows > Preferences > MyEclipse Enterprise Workbench > Community Essentials, 把选项 "Search for new features on startup"的前勑֎掉即? 2 关闭updating indexes Window > Preferences > Myeclipse Enterprise Workbench > Maven4Myeclipse > Maven>用Download repository index updates on startup 3 关闭MyEclipse的自动validation windows-->perferences-->myeclipse-->validation Build下全部勾取消 如果你需要验证某个文件的时候,我们可以单独去验证它。方法是Q在需要验证的文g? 右键 -> MyEclipse -> Run Validation 4 启动优化Q关闭不需要用的模块 Window > Preferences > General > Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块 我这里只让它加蝲tomcat5 N?MyEclipse EASIE Tomcat 5 5. 在myeclipse 7.0版本以上? window-preferences-MyEclipse Enterprise Work-Maven4MyEclipse-Maven, 取消选中Download repository index updates on startupQ?nbsp; 6. 关闭更新调度Qwindow --> preferences --> General --> Startup and Shutdown --> Automatic Updates SchedulerQ去掉前面的勾) ]]> 局部刷?/title> http://m.tkk7.com/Steven-bot/articles/362687.htmlSteven_bot Steven_bot Fri, 04 Nov 2011 07:07:00 GMT http://m.tkk7.com/Steven-bot/articles/362687.html http://m.tkk7.com/Steven-bot/comments/362687.html http://m.tkk7.com/Steven-bot/articles/362687.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/362687.html http://m.tkk7.com/Steven-bot/services/trackbacks/362687.html
局部刷斎ͼ
q个Ҏ多了去了,常见的有以下几种Q?/p>
$.getҎQ?.postҎQ?.getJsonҎ,$.ajaxҎ如下
前两U用方法基本上一?/p>
$.get(”Default.php”, {id:”1″, page: “2″ }, function(data){ //q里是回调方法。返回data数据。这里想怎么处理怎么处理了?br />});
$.getScriptҎQ?/p>
$.getScript(”http://jqueryajax.com/jquery.js”, function(){ $(”#go”).click(function(){//回调Ҏ $(”.block”).animate( { backgroundColor: ‘pink’ }, 1000) .animate( { backgroundColor: ‘blue’ }, 1000); }); });
$.getJson只是q回的数据类型不一?/p>
$.getJson(”Default.php”, {id:”1″, page: “2″ }, function(data){ //注意Q这里返回的JSON数据引用Ҏ?#8221;data.info”,不明白的可以查一下json斚w的教E。这里就不解释太多了 });
$.ajax q个Ҏ估计用的人很多吧。不q我不太喜欢用这个。个得前面两个更方便
$.ajax({ type: “POST”, //提交的类?br />url: “some.php”,//提交地址 data: “name=John&location=Boston”,//参数 success: function(msg){ //回调Ҏ alert( “Data Saved: ” + msg );//q里是方法内容,和上面的getҎ一?br />} });
下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()h当前面. parent.location.reload()h父亲对象Q用于框Ӟ opener.location.reload()h父窗口对象(用于单开H口Q?br />top.location.reload()h最端对象Q用于多开H口Q?/p>
]]> jquery validate 验证? http://m.tkk7.com/Steven-bot/articles/362685.htmlSteven_bot Steven_bot Fri, 04 Nov 2011 07:01:00 GMT http://m.tkk7.com/Steven-bot/articles/362685.html http://m.tkk7.com/Steven-bot/comments/362685.html http://m.tkk7.com/Steven-bot/articles/362685.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/362685.html http://m.tkk7.com/Steven-bot/services/trackbacks/362685.html jquery validate 验证?/span> 默认校验规则
(1)required:true 必输字段
(2)remote:"check.php" 使用ajaxҎ调用check.php验证输入?br />(3)email:true 必须输入正确格式的电子邮?br />(4)url:true 必须输入正确格式的网址
(5)date:true 必须输入正确格式的日?br />(6)dateISO:true 必须输入正确格式的日?ISO)Q例如:2009-06-23Q?998/01/22 只验证格式,不验证有效?br />(7)number:true 必须输入合法的数?负数Q小?
(8)digits:true 必须输入整数
(9)creditcard: 必须输入合法的信用卡?br />(10)equalTo:"#field" 输入值必d#field相同
(11)accept: 输入拥有合法后缀名的字符Ԍ上传文g的后~Q?br />(12)maxlength:5 输入长度最多是5的字W串(汉字一个字W?
(13)minlength:10 输入长度最是10的字W串(汉字一个字W?
(14)rangelength:[5,10] 输入长度必须介于 5 ?10 之间的字W串")(汉字一个字W?
(15)range:[5,10] 输入值必M?5 ?10 之间
(16)max:5 输入g能大?
(17)min:10 输入g能小?0
默认的提C?br />messages: {
required: "This field is required.",
remote: "Please fix this field.",
email: "Please enter a valid email address.",
url: "Please enter a valid URL.",
date: "Please enter a valid date.",
dateISO: "Please enter a valid date (ISO).",
dateDE: "Bitte geben Sie ein g眉ltiges Datum ein.",
number: "Please enter a valid number.",
numberDE: "Bitte geben Sie eine Nummer ein.",
digits: "Please enter on
ly digits", creditcard: "Please enter a valid credit card number.", equalTo: "Please enter the same value again.", accept: "Please enter a value with a valid extension.", maxlength: $.validator.format("Please enter no more than {0} characters."), minlength: $.validator.format("Please enter at least {0} characters."), rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), range: $.validator.format("Please enter a value between {0} and {1}."), max: $.validator.format("Please enter a value less than or equal to {0}."), min: $.validator.format("Please enter a value greater than or equal to {0}.") } 如需要修改,可在js代码中加入: jQuery.extend(jQuery.validator.messages, { required: "必选字D?, remote: "请修正该字段", email: "误入正格式的电子邮g", url: "误入合法的|址", date: "误入合法的日期", dateISO: "误入合法的日期 (ISO).", number: "误入合法的数字", digits: "只能输入整数", creditcard: "误入合法的信用卡号", equalTo: "请再ơ输入相同的?, accept: "误入拥有合法后~名的字符?, maxlength: jQuery.validator.format("误入一个长度最多是 {0} 的字W串"), minlength: jQuery.validator.format("误入一个长度最是 {0} 的字W串"), rangelength: jQuery.validator.format("误入一个长度介?{0} ?{1} 之间的字W串"), range: jQuery.validator.format("误入一个介?{0} ?{1} 之间的?), max: jQuery.validator.format("误入一个最大ؓ {0} 的?), min: jQuery.validator.format("误入一个最ؓ {0} 的?) }); 推荐做法Q将此文件放入messages_cn.js中,在页面中引入 <script src="../js/messages_cn.js" type="text/javascript"></script>四、用方?br />1.校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></script> <script src="../js/jquery.validate.js" type="text/javascript"></script> <script src="./js/jquery.metadata.js" type="text/javascript"></script> $().ready(function() { $("#signupForm").validate(); });
<form id="signupForm" method="get" action=""> <p> <label for="firstname">Firstname</label> <input id="firstname" name="firstname" class="required" /> </p> <p> <label for="email">E-Mail</label> <input id="email" name="email" class="required email" /> </p> <p> <label for="password">Password</label> <input id="password" name="password" type="password" class="{required:true,minlength:5}" /> </p> <p> <label for="confirm_password">认密码</label> <input id="confirm_password" name="confirm_password" type="password" class="{required:true,minlength:5,equalTo:'#password'}" /> </p> <p> <input class="submit" type="submit" value="Submit"/> </p> </form> 使用class="{}"的方式,必须引入包:jquery.metadata.js 可以使用如下的方法,修改提示内容Q?br />class="{required:true,minlength:5,messages:{required:'误入内?}}" 在用equalTo关键字时Q后面的内容必须加上引号Q如下代码: class="{required:true,minlength:5,equalTo:'#password'}" 另外一个方式,使用关键字:metaQؓ了元数据使用其他插g你要包装 你的验证规则 在他们自q目中可以用q个Ҏ的选项Q?br />Tell the validation plugin to look inside a validate-property in metadata for validation rules. 例如Q?br />meta: "validate" <input id="password" name="password" type="password" class="{validate:{required:true,minlength:5}}" />
再有一U方式: $.metadata.setType("attr", "validate"); q样可以使用validate="{required:true}"的方式,或者class="required"Q但class="{required:true,minlength:5}"不起作?br /> 2.校验规则写C码中
$().ready(function() { $("#signupForm").validate({ rules: { firstname: "required", email: { required: true, email: true }, password: { required: true, minlength: 5 }, confirm_password: { required: true, minlength: 5, equalTo: "#password" } }, messages: { firstname: "误入姓?, email: { required: "误入Email地址", email: "误入正的email地址" }, password: { required: "误入密?, minlength: jQuery.format("密码不能于{0}个字W?) }, confirm_password: { required: "误入确认密?, minlength: "认密码不能于5个字W?, equalTo: "两次输入密码不一致不一? } } }); }); //messages处,如果某个控g没有messageQ将调用默认的信?/p>
<form id="signupForm" method="get" action=""> <p> <label for="firstname">Firstname</label> <input id="firstname" name="firstname" /> </p> <p> <label for="email">E-Mail</label> <input id="email" name="email" /> </p> <p> <label for="password">Password</label> <input id="password" name="password" type="password" /> </p> <p> <label for="confirm_password">认密码</label> <input id="confirm_password" name="confirm_password" type="password" /> </p> <p> <input class="submit" type="submit" value="Submit"/> </p> </form> required:true 必须有?br />required:"#aa:checked"表达式的gؓ真,则需要验?br />required:function(){}q回为真Q表旉要验?br />后边两种常用于,表单中需要同时填或不填的元素 五、常用方法及注意问题 1.用其他方式替代默认的SUBMIT $().ready(function() { $("#signupForm").validate({ submitHandler:function(form){ alert("submitted"); form.submit(); } }); }); 可以讄validate的默认|写法如下Q?br />$.validator.setDefaults({ submitHandler: function(form) { alert("submitted!");form.submit(); } }); 如果x交表? 需要用form.submit()而不要?(form).submit()
2.debugQ如果这个参CؓtrueQ那么表单不会提交,只进行检查,调试时十分方?br />$().ready(function() { $("#signupForm").validate({ debug:true }); }); 如果一个页面中有多个表单,?br />$.validator.setDefaults({ debug: true })
3.ignoreQ忽略某些元素不验证 ignore: ".ignore"
4.errorPlacementQCallback Default: 把错误信息放在验证的元素后面 指明错误攄的位|,默认情况是:error.appendTo(element.parent());x错误信息攑֜验证的元素后?nbsp; errorPlacement: function(error, element) { error.appendTo(element.parent()); } //CZQ?br /><tr> <td class="label"><label id="lfirstname" for="firstname">First Name</label></td> <td class="field"><input id="firstname" name="firstname" type="text" value="" maxlength="100" /></td> <td class="status"></td> </tr> <tr> <td style="padding-right: 5px;"> <input id="dateformat_eu" name="dateformat" type="radio" value="0" /> <label id="ldateformat_eu" for="dateformat_eu">14/02/07</label> </td> <td style="padding-left: 5px;"> <input id="dateformat_am" name="dateformat" type="radio" value="1" /> <label id="ldateformat_am" for="dateformat_am">02/14/07</label> </td> <td></td> </tr> <tr> <td class="label"> </td> <td class="field" colspan="2"> <div id="termswrap"> <input id="terms" type="checkbox" name="terms" /> <label id="lterms" for="terms">I have read and accept the Terms of Use.</label> </div> </td> </tr> errorPlacement: function(error, element) { if ( element.is(":radio") ) error.appendTo( element.parent().next().next() ); else if ( element.is(":checkbox") ) error.appendTo ( element.next() ); else error.appendTo( element.parent().next() ); } 代码的作用是Q一般情况下把错误信息显C在<td class="status"></td>中,如果是radio昄?lt;td></td>中,如果是checkbox昄在内容的后面 errorClassQString Default: "error" 指定错误提示的csscdQ可以自定义错误提示的样?br />errorElementQString Default: "label" 用什么标{标记错误,默认的是label你可以改成em errorContainerQSelector 昄或者隐藏验证信息,可以自动实现有错误信息出现时把容器属性变为显C,无错误时隐藏Q用处不?br />errorContainer: "#messageBox1, #messageBox2" errorLabelContainerQSelector 把错误信息统一攑֜一个容器里面?br />wrapperQString 用什么标{ֆ把上边的errorELement包v?br />一般这三个属性同时用,实现在一个容器内昄所有错误提C的功能Qƈ且没有信息时自动隐藏 errorContainer: "div.error", errorLabelContainer: $("#signupForm div.error"), wrapper: "li" 讄错误提示的样式,可以增加图标昄 input.error { border: 1px solid red; } label.error { background:url("./demo/images/unchecked.gif") no-repeat 0px 0px; padding-left: 16px; padding-bottom: 2px; font-weight: bold; color: #EA5200; } label.checked { background:url("./demo/images/checked.gif") no-repeat 0px 0px; } successQString,Callback 要验证的元素通过验证后的动作Q如果跟一个字W串Q会当做一个cssc,也可跟一个函?br />success: function(label) { // set as text for IE label.html(" ").addClass("checked"); //label.addClass("valid").text("Ok!") } d"valid" 到验证元? 在CSS中定义的样式<style>label.valid {}</style> success: "valid" nsubmitQ?Boolean Default: true 提交旉? 讄唯falseq其他Ҏ去验?br />onfocusoutQBoolean Default: true 失去焦点是验?不包括checkboxes/radio buttons) onkeyupQBoolean Default: true 在keyup旉? onclickQBoolean Default: true 在checkboxes ?radio 点击旉?br />focusInvalidQBoolean Default: true 提交表单后,未通过验证的表?W一个或提交之前获得焦点的未通过验证的表?会获得焦?br />focusCleanupQBoolean Default: false 如果是true那么当未通过验证的元素获得焦ҎQ移除错误提C。避免和 focusInvalid 一L // 重置表单 $().ready(function() { var validator = $("#signupForm").validate({ submitHandler:function(form){ alert("submitted"); form.submit(); } }); $("#reset").click(function() { validator.resetForm(); }); }); remoteQURL 使用ajax方式q行验证Q默认会提交当前验证的值到q程地址Q如果需要提交其他的|可以使用data选项 remote: "check-email.php" remote: { url: "check-email.php", //后台处理E序 type: "post", //数据发送方?br /> dataType: "json", //接受数据格式 data: { //要传递的数据 username: function() { return $("#username").val(); } } }
q程地址只能输出 "true" ?"false"Q不能有其它输出 addMethodQname, method, message 自定义验证方?/p>
// 中文字两个字?br />jQuery.validator.addMethod("byteRangeLength", function(value, element, param) { var length = value.length; for(var i = 0; i < value.length; i++){ if(value.charCodeAt(i) > 127){ length++; } } return this.optional(element) || ( length >= param[0] && length <= param[1] ); }, $.validator.format("L保输入的值在{0}-{1}个字节之?一个中文字?个字?"));
// 邮政~码验证 jQuery.validator.addMethod("isZipCode", function(value, element) { var tel = /^[0-9]{6}$/; return this.optional(element) || (tel.test(value)); }, "h填写您的邮政编?);
radio和checkbox、select的验?br />radio的required表示必须选中一?br /><input type="radio" id="gender_male" value="m" name="gender" class="{required:true}" /> <input type="radio" id="gender_female" value="f" name="gender"/> checkbox的required表示必须选中 <input type="checkbox" class="checkbox" id="agree" name="agree" class="{required:true}" /> checkbox的minlength表示必须选中的最个?maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间 <input type="checkbox" class="checkbox" id="spam_email" value="email" name="spam[]" class="{required:true, minlength:2}" /> <input type="checkbox" class="checkbox" id="spam_phone" value="phone" name="spam[]" /> <input type="checkbox" class="checkbox" id="spam_mail" value="mail" name="spam[]" />
select的required表示选中的value不能为空 <select id="jungle" name="jungle" title="Please select something!" class="{required:true}"> <option value=""></option> <option value="1">Buga</option> <option value="2">Baga</option> <option value="3">Oi</option> </select> select的minlength表示选中的最个敎ͼ可多选的selectQ?maxlength表示最大的选中个数,rangelength:[2,3]表示选中个数区间 <select id="fruit" name="fruit" title="Please select at least two fruits" class="{required:true, minlength:2}" multiple="multiple"> <option value="b">Banana</option> <option value="a">Apple</option> <option value="p">Peach</option> <option value="t">Turtle</option> </select>
]]>获得当前路径, get java current directory http://m.tkk7.com/Steven-bot/articles/361974.htmlSteven_bot Steven_bot Tue, 25 Oct 2011 02:50:00 GMT http://m.tkk7.com/Steven-bot/articles/361974.html http://m.tkk7.com/Steven-bot/comments/361974.html http://m.tkk7.com/Steven-bot/articles/361974.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/361974.html http://m.tkk7.com/Steven-bot/services/trackbacks/361974.html 获得当前路径, get java current directory
String curDir = System.getProperty("user.dir"); 手册上写的getProperty可以使用的一些键?java.version Java q行时环境版?/td> java.vendor Java q行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目录 java.vm.specification.version Java 虚拟范版?/td> java.vm.specification.vendor Java 虚拟范供应商 java.vm.specification.name Java 虚拟范名U?/td> java.vm.version Java 虚拟机实现版?/td> java.vm.vendor Java 虚拟机实C应商 java.vm.name Java 虚拟机实现名U?/td> java.specification.version Java q行时环境规范版?/td> java.specification.vendor Java q行时环境规范供应商 java.specification.name Java q行时环境规范名U?/td> java.class.version Java cL式版本号 java.class.path Java c\?/td> java.library.path 加蝲库时搜烦的\径列?/td> java.io.tmpdir 默认的时文件\?/td> java.compiler 要用的 JIT ~译器的名称 java.ext.dirs 一个或多个扩展目录的\?/td> os.name 操作pȝ的名U?/td> os.arch 操作pȝ的架?/td> os.version 操作pȝ的版?/td> file.separator 文g分隔W(?UNIX pȝ中是“/”Q?/td> path.separator 路径分隔W(?UNIX pȝ中是“:”Q?/td> line.separator 行分隔符Q在 UNIX pȝ中是“/n”Q?/td> user.name 用户的̎户名U?/td> user.home 用户的主目录 user.dir 用户的当前工作目?/td>
java获取当前路径
1、利用System.getProperty()函数获取当前路径Q?br />System.out.println(System.getProperty("user.dir") );//user.dir指定了当前的路径 2、用File提供的函数获取当前\径:File directory = new File(""); //讑֮为当前文件夹 try{ System.out.println(directory.getCanonicalPath() );//获取标准的\?br /> System.out.println(directory.getAbsolutePath() );//获取l对路径 }catch(Exceptin e){} File.getCanonicalPath()和File.getAbsolutePath()大约只是对于new File(".") ?strong>new File("..")两种路径有所区别?br /> # 对于getCanonicalPath()函数Q?#8220;. "pC当前的文g夹,?#8221;.. “则表C当前文件夹的上一U文件夹 # 对于getAbsolutePath()函数Q则不管”. ”?#8220;.. ”Q返回当前的路径加上你在new File()时设定的路径 # 至于getPath()函数Q得到的只是你在new File()时设定的路径 比如当前的\径ؓ C:\test Q?br />File directory = new File("abc"); directory.getCanonicalPath(); //得到的是C:\test\abc directory.getAbsolutePath(); //得到的是C:\test\abc direcotry.getPath(); //得到的是abc File directory = new File("."); directory.getCanonicalPath(); //得到的是C:\test directory.getAbsolutePath(); //得到的是C:\test\. direcotry.getPath(); //得到的是. File directory = new File(".."); directory.getCanonicalPath(); //得到的是C:\ directory.getAbsolutePath(); //得到的是C:\test\.. direcotry.getPath(); //得到的是.. 另外QSystem.getProperty()中的字符串参数如下:System.getProperty()参数大全 # java.version Java Runtime Environment version # java.vendor Java Runtime Environment vendor # java.vendor.url Java vendor URL # java.home Java installation directory # java.vm.specification.version Java Virtual Machine specification version # java.vm.specification.vendor Java Virtual Machine specification vendor # java.vm.specification.name Java Virtual Machine specification name # java.vm.version Java Virtual Machine implementation version # java.vm.vendor Java Virtual Machine implementation vendor # java.vm.name Java Virtual Machine implementation name # java.specification.version Java Runtime Environment specification version # java.specification.vendor Java Runtime Environment specification vendor # java.specification.name Java Runtime Environment specification name # java.class.version Java class format version number # java.class.path Java class path # java.library.path List of paths to search when loading libraries # java.io.tmpdir Default temp file path # java.compiler Name of JIT compiler to use # java.ext.dirs Path of extension directory or directories # os.name Operating system name # os.arch Operating system architecture # os.version Operating system version # file.separator File separator ("/" on UNIX) # path.separator Path separator (":" on UNIX) # line.separator Line separator ("\n" on UNIX) # user.name User's account name # user.home User's home directory # user.dir User's current working directory 资料(System.getProperty()参数大全)Qhttp://yueguangyuan.javaeye.com/blog/71940
]]>【{载】location.reload和location.replaceh面的区?/title> http://m.tkk7.com/Steven-bot/articles/361957.htmlSteven_bot Steven_bot Tue, 25 Oct 2011 01:42:00 GMT http://m.tkk7.com/Steven-bot/articles/361957.html http://m.tkk7.com/Steven-bot/comments/361957.html http://m.tkk7.com/Steven-bot/articles/361957.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/361957.html http://m.tkk7.com/Steven-bot/services/trackbacks/361957.html 转蝲地址:http://www.dayanmei.com/blog.php/ID_816.htm
location.reload和location.replace都可以实现页面的hQ他们的区别是什么? reload ҎQ该Ҏ览器刷新当前页面?br />语法Q?location.reload([bForceGet]) 参数Q?bForceGetQ?可选参敎ͼ 默认?falseQ从客户端缓存里取当前页?br />true, 则以 GET 方式Q从服务端取最新的面, 相当于客L点击 F5("h")
replace ҎQ该Ҏ通过指定URL替换当前~存在历史里Q客LQ的目Q因此当使用replaceҎ之后Q你不能通过“前进”?#8220;后退”来访问已l被替换的URL?br />语法Q?location.replace(URL) 参数Q?URL
在实际应用的时候,重新h面的时候,我们通常使用Q?location.reload() 或者是 history.go(0) 来做。因U做法就像是客户端点F5h面Q所以页面的method="post"的时候,会出?#8220;|页q期”的提C。那是因为Session的安全保护机制。可以想刎ͼ 当调?location.reload() Ҏ的时候, aspx面此时在服务端内存里已l存在, 因此必定?IsPostback 的。如果有q种应用Q?我们需要重新加载该面Q也是说我们期望页面能够在服务端重新被创徏Q?我们期望?Not IsPostback 的。这里,location.replace() 可以完成此d。被replace的页面每ơ都在服务端重新生成。你可以q么写: location.replace(location.href)
]]> form 中Enctype=multipart/form-data 的作?/title> http://m.tkk7.com/Steven-bot/articles/361955.htmlSteven_bot Steven_bot Tue, 25 Oct 2011 01:38:00 GMT http://m.tkk7.com/Steven-bot/articles/361955.html http://m.tkk7.com/Steven-bot/comments/361955.html http://m.tkk7.com/Steven-bot/articles/361955.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/361955.html http://m.tkk7.com/Steven-bot/services/trackbacks/361955.html ENCTYPE="multipart/form-data"用于表单里有囄上传?/p>
文章来源Q?a style="font-weight: bold; color: #5c9a3d; text-decoration: none; ">http://hi.baidu.com/greengain/blog/item/e9c02855f564e6c0b645ae17.html
<form name="userInfo" method="post" action="first_submit.php" ENCTYPE="multipart/form-data"> 表单标签中设|enctype="multipart/form-data"来确保匿名上载文件的正确~码?br />如下Q?br /><tr> <td height="30" align="right">上传企业营业执照囄Q?lt;/td> <td><INPUT TYPE="FILE" NAME="uploadfile" SIZE="34" onChange="checkimage()"></td> </tr> 得加ENCTYPE="multipart/form-data"?/p>
表单中enctype="multipart/form-data"的意思,是设|表单的MIME~码。默认情况,q个~码格式是application/x-www-form-urlencodedQ不能用于文件上传;只有使用了multipart/form-dataQ才能完整的传递文件数据,q行下面的操? enctype="multipart/form-data"是上传二q制数据; form里面的input的g2q制的方式传q去?br />form里面的input的g2q制的方式传q去Q所以request得不到g?也就是说加了q段代码,用request׃传递不成功,取表单值加入数据库Ӟ用到下面的:
SmartUpload su = new SmartUpload();//新徏一个SmartUpload对象
su.getRequest().getParameterValues();取数l?/p>
su.getRequest().getParameter( );取单个参数单个?/p>
]]> MySQL和MSSQL下,text 、ntext?image、blob的比?/title> http://m.tkk7.com/Steven-bot/articles/360185.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 04:21:00 GMT http://m.tkk7.com/Steven-bot/articles/360185.html http://m.tkk7.com/Steven-bot/comments/360185.html http://m.tkk7.com/Steven-bot/articles/360185.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360185.html http://m.tkk7.com/Steven-bot/services/trackbacks/360185.html 1、MySQL存在text和blob:
Q?Q相?/p>
?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">BLOB 列的存储或检索过E中Q不存在大小写{?当未q行在严格模式时Q如果你?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">BLOB?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT列分配一个超q该列类型的最大长度的值|D截取以保证适合。如果截掉的字符不是I格Q将会生一条警告。用严?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">SQL模式Q会产生错误Qƈ且值将被拒l而不是截取ƈl出警告.BLOB ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT 列不能有 默认?当保存或?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">BLOB ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT列的值时不删除尾部空根{?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">(q与VARBINARY ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">VARCHAR列相同).对于BLOB ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT 列的索引Q必L定烦引前~的长度。对?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">CHAR ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">VARCHAR Q前~长度是可选的.Q?Q相?nbsp;
text :
TEXT值是大小写不敏感?/span> Text被视为非二进制字W串 TEXT 列有一个字W集Qƈ且根据字W集?校对规则对D行排序和比较可以?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT 列视?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">VARCHAR?/span>MySQL q接E序/ODBC ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">TEXT 值定义ؓLONGVARCHAR BLOB 可以储存囄,TEXT不行QTEXT只能储存U文本文件?个TEXTcdTINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应?个BLOBcdQƈ且有同样的最大长度和存储需求?/span> blob:
BLOB值的排序和比较以大小写敏感方式执? BLOB 被视Zq制字符?BLOB 列没有字W集Qƈ且排序和比较Z列值字节的数值倹{?/span>
在大多数斚wQ可以将BLOB 列视够够大?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">VARBINARY
?/p>MySQL q接E序/ODBC ?span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; ">BLOB 值定义ؓLONGVARBINARY 一个BLOB是一个能保存可变数量的数据的二进制的大对象?个BLOBcdTINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同?/span> Q?Q其他:
VARCHARQBLOB和TEXTcd是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示)Q而不是取决于cd的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度ؓ10个字W的一个字W串Q实际的存储需要是字符串的长度 Q加?个字节以记录字符串的长度。对于字W串'abcd'QL?而存储要求是5个字节?br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /> BLOB和TEXTcd需?Q?Q??个字节来记录列值的长度Q这取决于类型的最大可能长度。VARCHAR需要定义大,?55的最大限ӞTEXT则不需要。如果你把一个超q列cd最大长度的Dl一个BLOB或TEXT列,D截断以适合它?/span>
CHAR(n) 固定长度Q最?255 个字W?nbsp; VARCHAR(n) 可变长度QMySQL 4.1 及以前最?255 字符QMySQL 5 之后最?65535 字节 TINYTEXT 可变长度Q最?255 个字W?nbsp; TEXT 可变长度Q最?65535 个字W?nbsp; MEDIUMTEXT 可变长度Q最?16777215Q?^24 - 1Q个字符 LONGTEXT 可变长度Q最?4294967295Q?^32 - 1Q(4GQ个字符
2、MSSQL存在text、ntext和image:
ntext:
可变长度 Unicode 数据的最大长度ؓ 2^30 - 1 (1,073,741,823) 个字W。存储大是所输入字符个数的两倍(以字节ؓ单位Q。ntext ?SQL-92 中的同义词是 national text?/span>
text:
服务器代码页中的可变长度?Unicode 数据的最大长度ؓ 2^31-1 (2,147,483,647) 个字W。当服务器代码页使用双字节字W时Q存储量仍是 2,147,483,647 字节。存储大可能小?2,147,483,647 字节Q取决于字符Ԍ?/span>
image:
?Image 数据cd中存储的数据是以位字W串存储的,不是?SQL Server 解释的,必须由应用程序来解释。例如,应用E序可以使用 BMP、TIEF、GIF ?JPEG 格式把数据存储在 Image 数据cd中?/span>
]]> union、union all、intersect、minus http://m.tkk7.com/Steven-bot/articles/360169.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 02:14:00 GMT http://m.tkk7.com/Steven-bot/articles/360169.html http://m.tkk7.com/Steven-bot/comments/360169.html http://m.tkk7.com/Steven-bot/articles/360169.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360169.html http://m.tkk7.com/Steven-bot/services/trackbacks/360169.html 假设我们有一个表StudentQ包括以下字D与数据Q?/p>
drop table student;
create table student ( id int primary key, name nvarchar2(50) not null, score number not null );
insert into student values(1,'Aaron',78); insert into student values(2,'Bill',76); insert into student values(3,'Cindy',89); insert into student values(4,'Damon',90); insert into student values(5,'Ella',73); insert into student values(6,'Frado',61); insert into student values(7,'Gill',99); insert into student values(8,'Hellen',56); insert into student values(9,'Ivan',93); insert into student values(10,'Jay',90);
commit;
Union和Union All的区别?/strong> select * from student where id < 4
union
select * from student where id > 2 and id < 6
l果是
1 Aaron 78 2 Bill 76 3 Cindy 89 4 Damon 90 5 Ella 73
如果换成Union Allq接两个l果集,则返回结果是Q?/p>
1 Aaron 78 2 Bill 76 3 Cindy 89 3 Cindy 89 4 Damon 90 5 Ella 73
可以看到Q?strong>Union和Union All的区别之一在于寚w复结果的处理?/strong>
接下来我们将两个子查询的序调整一下,改ؓ
--Union
select * from student where id > 2 and id < 6
union
select * from student where id < 4
看看执行l果是否和你期望的一_
--Union All
select * from student where id > 2 and id < 6
union all
select * from student where id < 4
那么q个呢?
据此我们可知Q?strong>区别之二在于Ҏ序的处理?/strong>Union All按照关联的ơ序l织数据Q而Union进行依据一定规则进行排序。那么这个规则是Q我们换个查询方式看看:
select score,id,name from student where id > 2 and id < 6
union
select score,id,name from student where id < 4
l果如下Q?/p>
73 5 Ella 76 2 Bill 78 1 Aaron 89 3 Cindy 90 4 Damon
和我们预料的一_会按照字段的顺序进行排序。之前我们的查询是基于id,name,score的字D顺序,那么l果集将按照id优先q行排序Q而现在新的字D顺序也改变了查询结果的排序。ƈ且,是按照给定字Da,b,c...的顺序进行的order by。即l果是order by a,b,c...........的。我们看下一个查询:
select score,id,name from student where id > 2
union
select score,id,name from student where id < 4
l果如下Q?/p>
56 8 Hellen 61 6 Frado 73 5 Ella 76 2 Bill 78 1 Aaron 89 3 Cindy 90 4 Damon 90 10 Jay 93 9 Ivan 99 7 Gill
可以看到Q对于score相同的记录,按照下一个字Didq行排序。如果我们想自行控制排序Q是不是用order by指定可以了呢?{案是肯定的Q不q在写法上有需要注意的地方Q?/p>
select score,id,name from student where id > 2 and id < 7
union
select score,id,name from student where id < 4
union
select score,id,name from student where id > 8 order by id desc
order by子句必须写在最后一个结果集里,q且其排序规则将改变操作后的排序l果。对于Union、Union All、Intersect、Minus都有效?/strong>
注意Q?/strong>
1QUnion可以?strong>字段名不同但数据cd相同的结果集q行合ƈQ?/p>
2Q如?strong>字段名不?/strong>的结果集q行UnionQ那么对此字D늚Order by子句失?/strong>?/p>=================================================================================================================
Intersect和Minus的操作和Union基本一_q里一hȝ一下:
UnionQ对两个l果集进行ƈ集操作,不包括重复行Q同时进行默认规则的排序Q?/p>
Union AllQ对两个l果集进行ƈ集操作,包括重复?/strong>Q?strong>不进行排?/strong>Q?/p>IntersectQ对两个l果集进行交集操作,不包括重复行Q同时进行默认规则的排序Q?/p>
MinusQ对两个l果集进行差操作Q不包括重复行,同时q行默认规则的排序?/p>
可以在最后一个结果集中指定Order by子句改变排序方式?/p>
]]>由PowerDesigner物理模型生成sql语句 http://m.tkk7.com/Steven-bot/articles/360168.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 02:13:00 GMT http://m.tkk7.com/Steven-bot/articles/360168.html http://m.tkk7.com/Steven-bot/comments/360168.html http://m.tkk7.com/Steven-bot/articles/360168.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360168.html http://m.tkk7.com/Steven-bot/services/trackbacks/360168.html Tools-->Execute Commands-->Edit/Run Script 在打开的窗口中 past 下面的代码:
Option Explicit
ValidationMode = True
InteractiveMode = im_Batch
Dim mdl 'the current model
'get the current active model
Set mdl = ActiveModel
If (mdl Is Nothing) Then
MsgBox "There is no current Model"
ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model."
Else
ProcessFolder mdl
End If
'This routine copy name into code for each table, each column and each view
'of the current folder
Private sub ProcessFolder(folder)
Dim Tab 'running table
for each Tab in folder.tables
if not tab.isShortcut then
tab.comment = tab.name + tab.comment '此处L讄表的注释Q此处ؓ表名和注释一?/p>
Dim col ' running column
for each col in tab.columns
col.comment= col.name + col.comment
next
end if
next
Dim view 'running view
for each view in folder.Views
if not view.isShortcut then
view.comment = view.name
end if
next
' go into the sub-packages
Dim f 'running folder
For Each f In folder.Packages
if not f.IsShortcut then
ProcessFolder f
end if
Next
end sub
然后q行Run
Database --> Generate Database q时可以生成带有comments为物理模型中Name属性的SQL语句了?/p>
]]> 使用PowerDesigner的物理模型创建升U管理数据库(? http://m.tkk7.com/Steven-bot/articles/360167.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 02:10:00 GMT http://m.tkk7.com/Steven-bot/articles/360167.html http://m.tkk7.com/Steven-bot/comments/360167.html http://m.tkk7.com/Steven-bot/articles/360167.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360167.html http://m.tkk7.com/Steven-bot/services/trackbacks/360167.html
使用PowerDesigner的物理模型创建升U管理数据库 PowerDesigner是一U著名的CASE建摸工具Q最开始ؓ数据库徏模设计,即物理模?Physical Data Model)用于生成数据库表l构Q还有面向对象模?Object Oriented Model)Q用于徏立UML模型的结构,可以直接生成CS代码Q还有其他的模型{等Q不同的模型之间可以怺的{化。我最中意的就是它的物理模型直接设计生成数据库Q给我们Ҏ据库的生成升U维护带来极大的方便Q下面主要来讲一下它的物理模型设计?/h4>
1.使用PowerDesigner物理模型生成数据?/strong>
打开PowerDesigner在File里New选择Physical Data Model(物理模型)Q可在DBMS选项里面选择数据库的cdQ新建立模型后PowerDesigner自动创徏一个工作空?Workspace)攑֜里面Q然后模型下面默认会创徏一个名PhysicalDiagram_1的物理图表区Q这个其实就是用来区分数据库内某一模块的单元区域,我一般是把数据库内有关系的表攑֜同一块里面,如会员模块就叫MemberDiagrm里面放会员及其相关的表,其他模块另外新Z个另外放在一赗Q在IDE右上方的Palette是PowerDesigner里一些常见操作的工具面板Q点击选择 在图表区新徏一个FA_Member会员表,双击表在General里面修改表名描述Q这里的Name最好是用中文,然后Code是数据库的表名用英文,默认是Name to Code mirroring名字会连动的Q如果觉得这个功能有点讨厌可在Tools工具栏General Options里Dialog的Name to Code mirroring不选中卛_。表的列是在Columns选项卡里面添加的Q同样Name最好用中文描述而Codex表的列名了?后面的P、F、M选项分别代表主键、外键、强制的(字段不ؓI?Q选中主键强制的选项也会选中Q外键不可选当字段有外键引用时自动选中。双dD列可修改字D늚一些属性,有描q、字D늱型等Q字D默认值在Standard Checks选项卡的Values里Default处设|。再新徏一个会员类型表FA_MemberTypeQ此时会员表里面的会员类型字D应该是引用会员cd表里面的会员cd~号Q在PowerDesigner里表的主外关pd立的Ҏ是:在Palette工具面板里面选择 Reference后先点击从表然后再拖向主表,从表一条带头实线指向主表以表CZ外键引用关系Q双dpd以编辑引用关pd性,d键关pd名ؓQFK_从表_Reference_主表Q但注意q里的Code不是数据库内生成的主外键关系名,而是在Integrity选项卡里Constraint name讄Q另外对Insert和Update强制关系U联(Cascade)更新、删除操?sql2005叫叠层ƈ可以讄为空或默认?也在此选项卡内讄。Join选项卡里是设|两个主外键表的引用列,PowerDesigner会自动选择主表主键为默认主外键列,如果两个表的列名不一样则需要修改,无论是修改主外键q是表都能在Preview选项卡里面即旉览看到生成的SQL语句。生成整个数据库的SQL语句是在Database工具栏的Generate Database里,新徏一个sql目录专门攄成的sql语句文gQ第一ơ创建数据库所有表取名叫create1.0.sql(因ؓ后面全部是update)QGeneration type选择Script generation生成sql脚本文gQ而不要选择下面的Direct generation直接q接数据库执行,因ؓ有时候生成的SQL语句里面会有Warn警告需要稍做修改不然会报错?如修改表字段cd时候将以前表内数据导入时会有Warn)。Automatic archive自动备䆾也需要选中Q该选项使生成sql语句后将弹出保存当前工程模型的对话框Q后~名ؓapm(其实内容和工E文件格式pdm是一LQ同样都可以打开)Q徏议新Z个目录叫log里面存所有apm格式的归记录文Ӟ׃是创建数据库文g所以徏议取名叫create1.0.apmQ这栯与创建数据库的sql文g一一对应。要创徏数据库,扑ֈsql目录里生成的create1.0.sql文g执行卛_?/p>
2.使用PowerDesigner升l护数据?/strong>
做项目难免要升l护之前的数据库QPowerDesigner里的操作E微比创建时ȝ点,q是l箋以上面会员ؓ例子Q假如我现在已经创徏好了数据库,但是需求的变化我需要在会员表上面增加一个区域编Pq引用新建的区域表,那用PowerDesigner模型该如何操作呢Q首先开打pdm工程文gQ在以前模型基础上直接进行修改,q里的操作就是新Z个区域表在再会员表添加一个区域字D引用它的外键,所有的修改完成后在Database工具栏Modify Database里面q行生成修改后的SQL语句Q仍然徏议设|生成sql语句的目录放在之前徏立的sql目录下面Q但是现在的文g名应该叫update2.0.sqlQ或者加在后面加上括L要描qͼ如update2.0(add area).sql。注意记得指定Backup tables和Automatic archive选项Q选中Backup tables在修改表结构之前把原表改名加个tmp_前缀Q创建好新的表结构后再insert into from select tmp_表插入以前表内的数据Qv到备份以前表内数据功能,q就是ؓ什么有时候用PowerDesigner升数据库后会多一些tmp开头的临时表了QAutomatic archive是在生成升sql语句后提CZ存当前记录的选项。由于这ơ修Ҏ针对上创建数据库时候的修改Q注意指定Get database schema选项里的Using a archive model文gQ这里这个文件的路径应该是log目录下面的create1.0.apm文gQ因ơ升U是针对上次创徏数据库时的一ơ升U,PowerDesigner会自动拿当前模型和create1.0.apm之前保存的历史存档模型比较生成升U的sql语句Qƈ昄切的修改对比变化,很清C目了Ӟ如下图:
最后提CZ存Archive Model归档记录模型Q这里应该叫update2.0.amp(或加上括L要描q?q保存到log目录下面Q同样与update2.0对照Q这样命名条理清晰可L强。以后的升依此cLQ都是相对之前的归记录q行升Q升U后记得保存当前记录Q如果变化不大可以叫update2.1,update2.2依次递增Q如果修改较大可以升U一个版本序号叫update3.0Q或者后面加上括号和要的描述{。但是有时候我们修改的地方很少产生的update修改语句可能不会马上L行,而是要等C一ơ有多个修改的地方合h一起去更新Q这h们的话我们就有可能有多个update语句文g在服务器数据库上q没有执行,但是和以前的update语句却区分不开来到底有没有升q的Q虽然说PowerDesigner产生的升U语句是可以多次执行的,但不q么多,因ؓq样有可能会出错Q有个办法就是在每个已经升q的sql文g名后加个后缀_ed表示已经升q的Q这h下次升后就只执行那些没有_edq没有升U过的sql文g。当我们几次升数据库后Q会发现保存的数据库归记录文g排列得很整齐。^_^
PowerDesigner的apm归档格式文g也是可以直接打开的,有个时候我们可能需要数据库某个升版本的结构,那么现在您可以找到那个归档的apm文g用PowerDesigner直接打开Q选择Database工具栏的Generate Database选项Q那么这时候所产生的sql语句是那个版本数据库的所有表l构了?/p>
3.使用PowerDesigner的Domain自定义列cd
其实sqlserver数据库里面默认就支持用户定义的数据类型,该功能旨在对数据库字D实现通用和统一性,只要自定义一个数据库列类型,多处可以引用Q修改自定义数据cdQ所有引用处均自动修改,方便l一理。PowerDesigner吸收q种自定义数据类型功能到模型里面Q用Domain新徏一个用戯定义cdQ在模型的列cdDomain处可选择用户自定义类型,最后在生成sql语句的时候PowerDesigner会自动将所有选择用户自定义类型的字段cd替换为用戯定义cd里的字段cd(不是所有的数据库都支持自定义数据类?Q一般来说我们至会把表的主键字D做成一个用戯定义cdautoIdQ在autoId用户自定义类型里面我们设|它的类型Data type为int然后选中IdentityQ那么所有的引用表的主键是intcdq自动增长,假如有一天我们要UL数据库或更换所有的表主键的cd那么只要修改用户自定义类型所有引用的表主键字D便会跟着被修攏V还有一些字Dؓ了做到通用性也使用用户自定义类型,如表的标识字Dflag表示q行记录的状态,使用一个intcd的用戯定义cdq可讄默认|q有当前旉字段也徏议新Z个用戯定义cdQ在sqlserver数据库里面我们可以设|它的默认gؓgetdate()Q当我们更换成oracle或mysql数据库时候就只需要修改的默认gؓSYSDATE或CURDATE()卛_?/p>
4.使用PowerDesigner的Reverse反向工程生成模型
我们以前一些项目的数据库可能没有用PowerDesignerq行建模理Q那怎么办呢Q没有关p,PowerDesigner的Reverse反向工程帮您重新生成模型Q选择Database工具栏Reverse Engineer Database菜单QUsing script files是用sql脚本文g来反向生成模?不徏议用,如果sql语句太复杂生成的模型可能与你期待的有所差异Q毕竟PowerDesigner也不能全来识?Q用下面的Using a data source选项是用现有的数据库来生成Q我们可以先在Configure Connections菜单里面新徏立一个数据库q接Q选择好要q接的数据库驱动cdQ如果是Access数据库则指定本地mdb文g的\径,如果是连mysql数据库需要从|上下蝲一个ODBC For Mysql的驱动,Oracle和Sqlserver有默认的q接驱动E序Q输入正的数据库用户名和密码后列出数据库内所有表l构如下图:
可以看到我们从数据库反向生成模型的时候可以设|指定生成那些表、视图、用戯定义cd、触发器、存储过E、表d键关pR烦引等{,一般默认值就好,生成后我们可以看到数据库的结构原模原L被复制到物理模型里面QE-R囑֦下:
q样Q用PowerDesigner的Reverse反向工程功能便能"同步"到当前的数据库,先保存一份create1.0.amp创徏时候的数据库存档,之后在此基础上进行修Ҏ作,生成出来的sql语句是针对当前服务器上数据库的更新脚本?/p>
当我们创建的是PowerDesigner的面向对象模?Object Oriented Model)的时候同样也能用Reverse反向工程功能Q选择C#语言则指定cs文g的\径,q里一般ؓ数据库映的实体模型c,然后PowerDesigner便能生成对应的面向对象模型?/p>
5.使用PowerDesigner的物理模型生成不同的数据?strong> 和{换成OOM模型生成CS实体cM?/strong>
PowerDesigner的物理模型保存的文g是用XML来描q模型结构的格式Q所以它不会受Q何数据库cd的媄响。假如我们刚开始的例子是用sql2000数据库创建的物理模型Q那么现在用PowerDesigner能马上生成一份Oracle、DB2、Mysql或Access数据库的创徏脚本。选择Database工具栏中的Change Current DBMS菜单Q将以前的Microsoft SQL Server 2000改ؓMySQL 5.0Q以前sql2000数据库的模型摇n一变成了MySQLQ在Preview选项卡里面我们就能看到MySql的drop table if exists的sql语法?Q这里需要注意的是{换过E中可能会出C些错误,可能是因Z在模型里使用了某U数据库Ҏ的一些语法或功能Q在新选择数据库内不能被支持用,所以徏议从一开始就使用规范的一些SQL语法建立数据库ؓ后面有可能移植{换做考虑Q之前还提到了用Domian自定义类型,q里p很好的应用,如修改当前时间的自定义类型的默认gؓCURDATE()卛_修改所有引用字D以支持MySql数据库,或修改autoId自定义类型ؓ其他非intcd的主键等{?/p>
PowerDesigner里面各种模型是能实现无缝隙进行相互{换的。还是以刚开始会员ؓ例子Q我现在建好了物理模型需要{换ؓOOM模型Qƈ把数据库所有表映射生成cs代码实体cR点击Tools工具栏选择Generate Object-Oriented Model菜单Q选择生成OOM对象的语aQ这里以C# 2.0ZQ如果物理模型表里的NameZ文{换生成的OOMcd象字D里面也全是中文的话Q请保在{换时OOM Generation Options里的Detail选项卡内的Convert names to into codes没有被选中。{换成功后我们可以在OOM里面看到会员对象的一些关pd生成cs代码如下图:
从图片可以看出,会员与会员类型是1?关系Q而会员类型可以对应多个会员。所以生成的cs代码里会员表没有会员cd~号字段Q而有一个FA_MemberTypecd的属性,代表当前会员的会员类型,而会员类型表里面会多一个System.Collections.Generic.List<FA_Member>属性,代表当前会员cd的所有会员列表集合,PowerDesigner把这些面向对象的思想真的表现得淋漓尽致。但有时候我们需要的实体cL数据库内原分不动的字D|过来,而不需要FA_MemberTypecd的属性只要一个包含memberTypeId字段的完整会员表实体怎么办?我这里介l一个简单的办法Q在物理模型转换为OOM对象模型前先把表之间的所有Referencesd键关pd部删除掉Q可能删除表的主外键关系时会PowerDesigner也会把主从表的主外键列也全部删除去,讄Tools工具栏Model Options里Reference选项里的Auto-migrate columns勑֎掉即可。删除后不保存之前的物理模型直接转换成OOM后再Ctrl+Z恢复之前删除的ReferencesQ这时可以看到OOM模型里面的会员类对象便是数据库会员表所有字D原分不变的映射。另外,OOM模型可以直接生成VS的工E文件带所有cs实体cLӞ那么Q我们用PowerDesigner建立好数据库的物理模型后Q又可{换成OOM对象模型L生成cs代码实体cR?/p>
可能有些朋友的PowerDesigner打开工程Preview里看到的不是我这Lcs代码Q而是一些public int MemberId之类的字D,q是因ؓPowerDesigner物理模型{换到OOM对象模型的时候表的所有字D|被变成类模型里面的AttributesQ而Attributes配置生成的模杉K认是不带有get和set讉K器的Q修改Language工具栏Edit Current Object Language菜单扑ֈProfile > Attribute > Templates > definition修改模板卛_。我的C#2.0模板如下Q?/p>
. if ( % isGenerated % ) and ( % isValidAttribute % ) [ % comment % /n]/ [ % oidDocTag % /n]/ [ % customAttributes % /n]/ . if ( % Multiple % == false ) and ( % isIndexer % == false ) private [ % flags % ] % dataType % % fieldCode % [ = % InitialValue % ]; [ % visibility % ][ % flags % ] % dataType % .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) { get { return % fieldCode % ; } set { % fieldCode % = value; } } . else private [% flags % ] % dataType % [ % arraySize % ] % fieldCode % [ = % InitialValue % ]; [ % visibility % ][ % flags % ] % dataType % .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) { get { return % fieldCode % ; } set { % fieldCode % = value; } } .endif .endif
Java 5.0带get和set讉K规则Bean对象生成模板如下Q?/p>
. if ( % Multiple % ) [ % javaDocComment % /n]/ private [ % flags % ] % dataType % /[/] % fieldCode % [ = % initialValue % ]; % visibility % % flags % % dataType % /[/] get .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) () { return this . % fieldCode % ; } % visibility % % flags % % dataType % /[/] set .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) ( % dataType % % fieldCode % ) { this . % fieldCode % = % fieldCode % ; } . else [% javaDocComment % /n]/ private [ % flags % ] % dataType % % fieldCode % [ = % initialValue % ]; % visibility % % dataType % get .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) () { return this . % fieldCode % ; } % visibility % void set .convert_name( % fieldCode % ,, " _ " ,FirstUpperChar) ( % dataType % % fieldCode % ) { this . % fieldCode % = % fieldCode % ; } .endif
PowerDesigner几乎所有模型{换生成都可以使用模板来配|,q样能充分的让用戯定义来实现想要的功能?/p>
PowerDesigner的OOM功能q远不只q一些,最重要的是使用UML建用例图了,在面向对象里面的l承、多态,面向接口~程Q对象之间的依赖、包含等关系也能在这里一一体现Q不同的头U条各自代表着不同的意思,也能够生成一些cs伪代码,׃本文主要PDM物理模型Q这里就不再赘述。不知那些大师也会不会用PowerDesigner或Rose来画d呢?
6.使用Report导出生成HTML格式的数据库表结构数据字?/strong>
对于一个有着很多个表的庞大的数据库,直接L看数据库的结构显得很费力Q比如我们在~程的时候要从几百个表里面找到表然后再从几十个列里去扑ֈ列的注释说明Q很ȝQ用PowerDesigner的Report功能自动生成所有表列的html的树状菜单结构,也可以作为数据库的帮助文档,使得我们找什么东西再也不需要跑到数据库内去看。选择Report工具栏选择Generate Report菜单使用Full Physical Report全部生成卛_Q生成后html效果囑֦下:
囄未能复制q来Q非常抱歉!
]]>主题Qstruts2 Tags 堆栈分析 http://m.tkk7.com/Steven-bot/articles/360160.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 01:33:00 GMT http://m.tkk7.com/Steven-bot/articles/360160.html http://m.tkk7.com/Steven-bot/comments/360160.html http://m.tkk7.com/Steven-bot/articles/360160.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360160.html http://m.tkk7.com/Steven-bot/services/trackbacks/360160.html 1. property: <s:property value="username"/> 2. property 取gؓ字符? <s:property value="'username'"/>
3. property 讑֮默认? <s:property value="admin" default="理?/>
4. property 讑֮HTML: <s:property value="'<hr/>'" escape="true"/> 输出 <hr/>
5. set 讑֮adminName|默认为request ?ActionContextQ? <s:set var="adminName" value="username" />
set 从request取? <s:property value="#request.adminName" /> set 从ActionContext取? <s:property value="#adminName" />
set 讑֮范围: <s:set var="adminPassword" value="password" scope="session"/>
set 从相应范围取? <s:property value="#session.adminPassword"/>
说明Qset 在以前的版本中有name id,但是?.1版本开始不推荐使用,用var代替.实际var表示把变量压入栈actioncontext. 官方q样说明var? Name used to reference the value pushed into the Value Stack;
q样我们可以?key来访?
6. bean标签
<s:bean name="com.awf.tags.Dog" var="mydog"> <s:param name="name" value="'pp'"></s:param> <s:property value="name"/> </s:bean>
说明:注意到pp用单引号,因ؓq时要真正用到String,如果没有加单引号Qstruts2会默认用OGNL到ValueStack扑ր?
对于Z么可?lt;s:property value="name"/>(取到pp)q样取?可以做个实验在set标签里加?lt;s:debug/>,q样你可能看到整个栈?据的出入,此时栈顶当然是mydog对象,q个标签执行完后可以出栈了Q这时action又保持在栈顶?
此时mydog被存入到actioncontext栈中,所以要取D用到#号了.
取?<s:property value="#mydog.name/>
7. include标签
<s:include value="/index.html"></s:include>
q里value的默认处理方式是要内容当做StringQ不是OGNL,如果q时要用OGNL可以?,q就?的实际意义了,其实上面所讲的标签 也可以?,OGNL对于那些默认使用OGNL的标{会忽略%?真搞不懂Z么全部都l一Q这h们就不用记这么多了^^,下面是具体用方?
<s:set var="incPage" value="%{'/index.html'}" /> <s:include value="%{#incPage}"></s:include>
现在回到include标签,q个标签真的不好用对中文的支持不好,可能有BUG,所以还是用jsp自带的动态包?静态包?
8. if elseif else标签
定义变量 num= <s:set var="num" value="'100'"/> set定义的变量存在ActionContext栈中
<s:if test="#num< 0"> 于0 </s:if> <s:elseif test="#num <50"> 于50 </s:elseif> <s:else>大于50</s:else>
<s:if test="#parameters.aaa == null">null</s:if>
q里说到 #parameters 不得不提一下,我们在地址栏输入的变量会存在ActionContext栈中,如xx/sdfds.jsp?name=1
q样我们可能用OGNLq样取?/span>#parameters.name ,注意q里 取出来的是一个集?/span>,如果你这栯问xx/sdfds.jsp?name=1&name=2,你可以发现可以取Z个?因ؓq样所以在写程序时我样最好精定位像q样#parameters.name[0],q你能保证只能一个?也要q样.
9. iterator标签,遍历集合
<s:iterator value="{1, 2, 3}" > <s:property/> </s:iterator>
自定义变?
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x"> <s:property value="#x.toUpperCase()"/> | </s:iterator>
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status"> <s:property/> | 遍历q的元素LQ?lt;s:property value="#status.count"/> | 遍历q的元素索引Q?lt;s:property value="#status.index"/> | 当前是偶敎ͼQ?lt;s:property value="#status.even"/> | 当前是奇敎ͼQ?lt;s:property value="#status.odd"/> | 是第一个元素吗Q:<s:property value="#status.first"/> | 是最后一个元素吗Q:<s:property value="#status.last"/> <br /> </s:iterator>
说明:偶数和其C是下标,下标0其实是第一个当然是奇数?
遍历map:
<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x"> <s:property value="#x.key"/> | <s:property value="#x.value"/> <br /> </s:iterator>
]]>?Linux ?Windows 下给 Tomcat 分配大内存设|方?? http://m.tkk7.com/Steven-bot/articles/360157.htmlSteven_bot Steven_bot Sat, 08 Oct 2011 01:25:00 GMT http://m.tkk7.com/Steven-bot/articles/360157.html http://m.tkk7.com/Steven-bot/comments/360157.html http://m.tkk7.com/Steven-bot/articles/360157.html#Feedback 0 http://m.tkk7.com/Steven-bot/comments/commentRss/360157.html http://m.tkk7.com/Steven-bot/services/trackbacks/360157.html 初始I间(?Xms)是物理内存的1/64Q最大空?-Xmx)是物理内存的1/4?br style="line-height: 24px; " /> 可以利用JVM提供?Xmn -Xms -Xmx{选项可进行设|?p style="line-height: 24px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">实例Q以下给?G内存环境下java jvm 的参数设|参考: JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true ” JAVA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m” CATALINA_OPTS=”-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m” LinuxQ?/span>
?usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh dQJAVA_OPTS=’-Xms512m -Xmx1024m’ 要加“m”说明是MBQ否则就是KB了,在启动tomcat时会报内存不?/span>-XmsQ初始?/span>-XmxQ最大?/span>-XmnQ最?/span>
Windows 在catalina.bat最前面加入 set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK讄生效.够成功的分配200M内存.
但是如果不是执行startup.bat启动tomcat而是利用windows的系l服务启动tomcat服务, 上面的设|就不生效了, 是说set JAVA_OPTS=-Xms128m -Xmx350m 没v作用. 上面分配200M内存OOM?. windows服务执行的是bin\tomcat.exe.他读取注册表中的?而不是catalina.bat的设|? 解决办法: 修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation \Tomcat Service Manager\Tomcat5\Parameters\JavaOptions 原gؓ -Dcatalina.home=”C:\ApacheGroup\Tomcat 5.0″ -Djava.endorsed.dirs=”C:\ApacheGroup\Tomcat 5.0\common\endorsed” -Xrs 加入 -Xms300m -Xmx350m 重vtomcat服务,讄生效 QTomcat 5.5 的话Q在Apache Software Foundation下有个Procrun 2.0?Tomcat5\Parameters\Java?/span>讄JvmMs和JvmMx的值就可以了,要修?0q制的值哦Q?/span>
不过QOS对内存也有限?/span>
附:如何获得JVM的最大可用内?/span>
在命令行下用 java -XmxXXXXM -version 命o来进行测试,然后逐渐的增大XXXX的|如果执行正常pC指定的内存大小可用Q否则会打印错误信息?/span>
实际发现版本上有l微差别的JDK最大容许内存值都不尽相同Q因此在实际的应用中q是要自p验一下看到底内存能达C么样的倹{?/span>
通过q个表想说明的是Q如果你的机器的内存太多的话Q只能通过多运行几个实例来提供机器的利用率了,例如跑TomcatQ你可以多装几个Tomcatq做集群Q依此类推?/span>
q个人家试的结果,我这里引用一?/span>
公司 JVM版本 最大内??client 最大内??server SUN 1.5.x 1492 1520 SUN 1.5.5(Linux) 2634 2660 SUN 1.4.2 1564 1564 SUN 1.4.2(Linux) 1900 1260 IBM 1.4.2(Linux) 2047 N/A BEA JRockit 1.5 (U3) 1909 1902
所以跟OS的系l版本,jdk版本有很大的关系。要是希望充分利用内存,p虑使用集群?/span>
********************************************************************************************88
一、在tomcat的catalina.bat中修改,加入-Dcom.sun.management.jmxremote参数 set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote
二、需要用jdk5.0以上Q打开bin目录下的jconsole.exeQ即可连接跟ttomcat的内存用情?nbsp;
tomcatU程数配|:
conf/server.xml:中修?/span>
<Connector port="80" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1200" minSpareThreads="100" maxSpareThreads="300" enableLookups="false" redirectPort="8443" acceptCount="1000" connectionTimeout="15000" disableUploadTimeout="true" compressableMimeType="text/html,text/plain,text/xml,text/css,text/javascript" compression="on" URIEncoding="GBK"/>
]]>
վ֩ģ壺
WWWƵ߹ۿ |
ţţ߾Ʒۿ
|
aëƬƵѹۿ |
Ƶ̫ˬ |
avպavŷv |
þɫĻþþ |
ƷþþþAVƬ |
Ļ߿˶Ƭ
|
aëƬѹۿվ |
ѿƵվ |
պ߾Ʒһ |
һavҩ߳ |
һëƬѲ |
a߹a |
ɫ͵С˵ |
avԴվavַ |
Ƶ߹ۿ |
ˬˬձƵ |
AVպAV
|
avվ |
뾫ƷŮ˾þþò |
ƷӰԺþþþþ |
ѹۿվ |
ԻȫƵ߹ۿ |
Ʒ |
vaӰ |
ѾƷԲ߹ۿͼƬ |
ۺav뾫Ʒһ |
ɫƷVRһ |
һëƬѿ |
˳ɹƷ |
avһ
|
Ƶ߹ۿ
|
99߾Ʒȫmy |
ƷSSS߹ۿAV |
ŷպɫ |
ѹۿɫվ |
߲ |
þëƬѿһ |
һ |
˳77777߲վ |