如何实现properties文件value设置为变量由程序传参控制参数 20C

如何实现properties文件value设置为变量由程序传参控制参数 有什么实现方法么

3个回答

可以将properties的value用$包裹,如a=${xx},当程序通过prop.getProperty("a")时发现值是带$则解析这个xx,这个xx具体的值可以来自系统变量或其他

楼主你好,properties文件里面的值本来用法是一个key对应一个value,是用来取值的,楼主这样的需求,为什么不在一个静态常量类里面设置一个静态常量,然后去控制这个静态常量呢

要是动态 又何必 写在properties文件里 参数直接传过来 就好了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
properties文件内容的unicode转换(提问)
[size=medium]在开发过程中,为了使开发出来的代码更健壮、更灵活,我们常常把一些常变的变量写 <br />入到配置文件中。而在这些配置文件中,properties文件是使用的比较多的,它不仅配置起 <br />来简单(一个key=value形式即可),而且在对文件的操作中也比较方便。 <br />&nbsp; <br />&nbsp;&nbsp;&nbsp; 由于字符的编码问题以及properties文件在国际化的使用过程中,我们常常需要将文件 <br />内容转换为unicode码。以免从文件里取出的内容为乱码。 <br /> <br />&nbsp;&nbsp;&nbsp; 解决上面问题,我们一般采用一些如 properties editor 形式的插件。现在我写了一段 <br />类似properties editor的转码程序(转换为unicode码)。大致功能是:从一个properties文件里逐行读出一字符串(有可能是注释,也有可能是 'key=value' 形式的属性配置)。然后将属性配置行的value转换为unicode码,转换完后写入到另一个文件里。 <br /><span style="color: blue"> <br />&nbsp;&nbsp;&nbsp; 现在的问题是,上面功能能完成,即可以把properties文件转换成一个内容为unicode的 <br />properties文件(后面称unicode文件)。但是,在从unicode文件读文件配置内容时候,就会报错,或根本就不能通过Properties.load(in)的形式加载文件。希望您能花点时间,帮我解决这个问题。</span> <br /> <br />&nbsp;&nbsp;&nbsp; 也许我描述的不太清楚,现在我贴出部分代码,您先看看,知道我的大概意思,然后把整 <br />个工程下载到你本地,你帮我调试一下。先说明一下,对这个问题,我研究了好几天,实在找 <br />不到解决问题的方法,才贴出的。请大家别责怪我不思考就贴出问题来。 <br /> <br /><pre name="code" class="java">package com.tja.code; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.Properties; import java.util.Queue; import com.tja.util.StringUtil; import com.tja.util.file.CREATE_METHOD; import com.tja.util.file.FileUtil; /** * 将properties文件内容换成Unicode码形式的properties文件 * * */ public class UnicodeUtil { /** * unicode码前缀 */ private static final String UNICODE_PREFIX = "\\u"; /** * 文件内容注释标志 */ private static final String COMMENTS_PREFIX = "#"; /** * 属性(properties)文件中的等于 '=' 符号 */ private static final String EQUAL_SIGNAL = "="; public static void propFile2Unicode(String fileName) throws FileNotFoundException, IOException { //Assert.notNull(fileName); propFile2Unicode(new File(fileName),null); } /** * 将属性文件里内容转换为unicode码(只将文件里的value转换为unicode,而key值不变)。 * 实现逻辑: 逐行读取文件内容,对每行内容进行转码(转成unicode形式),对转码的内容 * 又存入一队列中。最后使用队列先进先出的特点将所有内容写入一新的文件里, * 即fileName. * @param file * 属性文件(properties文件) * @param fileName * 记录转码后内容的文件名 * @throws FileNotFoundException * @throws IOException */ public static void propFile2Unicode(File file,String fileName) throws FileNotFoundException, IOException { BufferedReader br = new BufferedReader(new FileReader(file)); String line; String unicodeValue; Queue&lt;String&gt; queue = new LinkedList&lt;String&gt;(); while((line = br.readLine())!=null) { unicodeValue = value2unicode(line); //对读出的一行内容进行转码 queue.add(unicodeValue); } br.close(); //如果没指定文件名,则将内容写入原文件里 String filePath = StringUtil.hasLength(fileName)?fileName:file.getAbsolutePath(); write2file(filePath,queue); } /** * 将一行字符串转换成unicode形式。注意,分了注释和非注释的处理,注释 * 的内容也要转换成unicode形式 * * @param str * 字符串 * @return */ public static String value2unicode(String str) { return str.startsWith(COMMENTS_PREFIX)?dealWithComments(str):dealWithNonComments(str); } /** * 对注释内容进行转换成unicode,注释符号'#'不作处理 * * @param comments * 注释字符串,形式为 '#abccom好' * @return */ public static String dealWithComments(String comments) { //Assert.notNull(comments); if(!comments.startsWith(COMMENTS_PREFIX)) { throw new IllegalArgumentException("the parameter["+comments+"] is not comments!"); } String comment = comments.substring(1); return COMMENTS_PREFIX+GBK2Unicode(comment); } /** * 对非注释的一行字符串进行unicode转码,该字符串格式要求为key=value形式 * 即如:userName=xiaoxin。否则会抛出异常 * * @param non_comments * 非注释字符串 * @return */ public static String dealWithNonComments(String non_comments) { if(null == non_comments || 0 == non_comments.trim().length()) { return ""; } if(non_comments.startsWith(COMMENTS_PREFIX)) { throw new IllegalArgumentException("the parameter["+non_comments+"] is comments!"); } int index = non_comments.indexOf(EQUAL_SIGNAL); if(index == -1) { throw new IllegalArgumentException("the parameter["+non_comments+"] has no '=' !"); } String key = non_comments.substring(0,index+1); String value = non_comments.substring(index+1); return key+GBK2Unicode(value); } /** * 将队列内容写入指定文件里 * * @param filePath * @param queue * @throws IOException */ private static void write2file(String filePath,Queue&lt;String&gt; queue) throws IOException { //Assert.hasText(filePath); FileUtil.createFullPathFile(filePath, CREATE_METHOD.OVERWRITE); while(!queue.isEmpty()) { String content = queue.poll(); FileUtil.write2File(filePath, true,null, content+"\n"); } } /** * 字符串类型转换为Unicode * @param str * @return */ public static String GBK2Unicode(String str) { if(null == str) { return ""; } StringBuffer buf = new StringBuffer(UNICODE_PREFIX); for(int i = 0;i&lt;str.length();i++) { buf.append(char2Unicode(str.charAt(i))); if(i != str.length()-1) { buf.append(UNICODE_PREFIX); } } return buf.toString(); } /** * char类型转换为Unicode * @param ch * @return */ public static String char2Unicode(char ch) { return Integer.toString(ch, 16); } public static void main(String[] args) throws FileNotFoundException, IOException { String str = "D:/bb.properties"; String str1 = "D:/cc.properties"; String ss = "项目额度"; UnicodeUtil.propFile2Unicode(new File(str),str1); String g = UnicodeUtil.GBK2Unicode(ss); System.out.println(g); InputStream in = new FileInputStream(new File(str1)); Properties p = new Properties(); p.load(in); System.out.println(p.getProperty("FMS.loader.project")); System.out.println(p.getProperty("FMS.chinese")); } } </pre> <br /> <br />&nbsp; 请大家有时间帮忙看看。哦运行报的错误如下: <br /> <br /> <span style="color: red">&nbsp;&nbsp; Exception in thread "main" java.lang.IllegalArgumentException: Malformed \uxxxx encoding. <br /> at java.util.Properties.loadConvert(Unknown Source) <br /> at java.util.Properties.load(Unknown Source) <br /> at com.tja.code.UnicodeUtil.main(UnicodeUtil.java:175)</span>[/size]<br/><strong>问题补充</strong><br/><div class="quote_title">helin 写道</div><div class="quote_div">load的时候指定编码</div> <br /> <br /> <br />恕小弟愚笨,请问load的时候怎么指定编码呢?能给点例示代码吗?
spring+mybatis 使用mapper配置无法加载properties 文件
<beans default-autowire="byName" xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <context:property-placeholder location="classpath*:jdbc.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${mydriver}"></property> <property name="url" value="${myurl}"></property> <!-- spring4.3以后,这里引入的用户名变量,不能是username --> <property name="username" value="${myuser}"></property> <property name="password" value="${mypwd}"></property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis_cfg.xml"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <property name="basePackage" value="com.yz.assurance.dao" /> </bean>
spring 配置文件里变量改用数据库加载的问题。
大侠们,我最近做的一个 发送mail 的程序,spring里配置的参数信息是从properties文件里加载进来的。最近想改成从数据库里读取的方式。突然就没有思路了。哪个哥哥能给个思路指点一下我。不胜感激 [code="java"]<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${mail.host}" /> <property name="username" value="${mail.username}" /> <property name="password" value="${mail.password}" /> <property name="defaultEncoding" value="UTF-8"></property> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">${mail.smtp.auth}</prop> <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop> </props> </property> </bean> [/code]
程序里面有静态变量,我想执行好几遍,每次的变量值都从外面获取,我的静态变量应该怎么改
我发下主要代码吧,涉及到静态变量的。主要是想把文件路径filename和获取的source的名字改成非静态的 public class ProcessRow { static Properties source; static { try { source = new Properties(); FileInputStream fis = new FileInputStream(new File( inputPropertieName())); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); source.load(isr); fis.close(); } catch (Exception e) { // throw new ExceptionInInitializerError(e); } } public static String filterAlphabet(String alph) { alph = alph.replaceAll("[^(A-Z)]", ""); return alph; } public String Pname() { String hai = UseProcess.fileName; String a = filterAlphabet(hai); String b = hai.substring(hai.indexOf(a), hai.indexOf(a) + 6); return b; } public static String inputPropertieName() { /* * System.out.println("请输入配置文件名称:"); Scanner a = new Scanner(System.in); * String propertieName = a.next(); */ // a.close(); ProcessRow a = new ProcessRow(); String propertieName = a.Pname(); return propertieName; } // 判断方法1,2 public boolean panduan1(XSSFRow from) { return from.getCell(8).toString().trim() .equals(source.getProperty("I列值1")) && (from.getCell(2).toString().trim().equals(source .getProperty("C列值1")));// 1 I列值为“I列值1” 且C列值为“C列值1” } public boolean panduan2(XSSFRow from) { return from.getCell(8).toString().trim() .equals(source.getProperty("I列值2")) && (from.getCell(2).toString().trim().equals(source .getProperty("C列值2")));// 2 I列值为“I列值2” 且C列值为“C列值2” } ......... Output类 public class Output { static Date d = new Date(); static DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); final static String fileName = df.format(d); static String b = null; static String c = ProcessRow.source.getProperty("输出路径")+fileName + "_main" + ".xlsx"; public static FileOutputStream init() { FileOutputStream s = null; try { s = new FileOutputStream(c); } catch (FileNotFoundException e) { } return s; } public static XSSFWorkbook getWorkbook() throws IOException{ FileInputStream fis = new FileInputStream(c); XSSFWorkbook wb = new XSSFWorkbook( fis ); return wb; } } UseProcess类 public class UseProcess { static String fileName=UseProcess.fileName(); static XSSFSheet readsheet; static { try { readsheet = readWorkbook(); } catch (Exception e) { // TODO: handle exception } } static XSSFWorkbook sc = null; static XSSFWorkbook sr = null; public static String fileName() { System.out.println("请输入文件路径(将文件拖入程序):"); Scanner a = new Scanner(System.in); String fileName = a.next(); //a.close(); return fileName; } ArrayList<String> date1 = new ArrayList<String>(); ArrayList<Double> value1 = new ArrayList<Double>(); ArrayList<String> date2 = new ArrayList<String>(); ArrayList<Double> value2 = new ArrayList<Double>(); int lastnum = getNum(fileName); int i = Integer.parseInt(ProcessRow.source.getProperty("表单数据从第几行开始")) - 1; static int j = 1; public static int getNum(String Filename) { try { InputStream myxls; myxls = new FileInputStream(Filename); sr = new XSSFWorkbook(myxls); XSSFSheet sheet = sr.getSheetAt(0);// 第一个工作表 return sheet.getLastRowNum();// 获取第一个工作表的行数 } catch (IOException e) { return 0; } } 主函数 public class TestMain { public static void test() throws IOException, NumberFormatException, ParseException{ UseProcess.createWorkbook(); UseProcess n = new UseProcess(); for (int i = 1; i <= Integer.parseInt(ProcessRow.source .getProperty("condition-process的个数")); i++) { n.UseProcess1(String.valueOf(i)); } n.UseProcessNull(); System.out.println("输入完毕"); } public static void main(String[] args) throws NumberFormatException, IOException, ParseException { TestMain.test(); }
问一个我自己都觉得低端的问题,有关js页面的,忘记怎么个原理了
就是我在配置文件properties中定义了多个不同 key-value,然后页面上就用到了这个变量的key取到了value的值,搞不明白是怎么回事了,各位,帮解答一下吧
在Spring Boot项目中,Thymeleaf如何使用消息表达式(#{})?
``` <select class="col-sm-2 form-control" id="searchPost"> <option value="">请选择</option> <option th:value="#{post.java.value}" th:text="#{post.java.name}"></option> <option th:value="#{post.c.value}" th:text="#{post.c.name}"></option> <option th:value="#{post.oracle.value}" th:text="#{post.oracle.name}"></option> <option th:value="#{post.test.value}" th:text="#{post.test.name}"></option> </select> ``` 引用我resources/templates下的.properties文件中的变量。 但是结果却不能正常显示:`<option value="??post.java.value_zh_CN??">??post.java.name_zh_CN??</option>`
jdbc执行sql 不支持“variant”数据类型。
我一个sql查询表说明字段 ``` select top 100 [value] from sys.extended_properties ``` 在java中使用jdbc执行的时候总是报错,说value是一个变量类型。如下错误 ``` Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 不支持“variant”数据类型。 ``` 请问有人遇到过吗,如何解决
请问如何通过配置文件配置web.xml
想向大家请教一个问题:怎么通过config.properties配置web.xml. 比如下面例子中的${group}, 想通过变量group=***来配置。请问如何做到 <filter> <filter-name>sessionFilter</filter-name> <filter-class>com.xxSessionFilter</filter-class> <init-param> <param-name>sessionConfigGroup</param-name> <param-value>${group}</param-value> </init-param> </filter>
Android ant 脚本打包 关联library project的项目
以下是build.xml Android ant 脚本打包 关联library project的项目,java源文件编译成class文件时 找不到R 打包cardview的library时 总是不能成功,其他library生成的都是包。但是cardview就是不行················································· <?xml version="1.0" encoding="UTF-8"?> <project name="recyclerexample" default="release" basedir="."> <!-- 指定配置文件 --> <property file="project.properties" /> <property file="local.properties" /> <!-- 定义工具目录 --> <property name="sdk.dir" value="${sdk-dir}" /> <property name="android.tools.dir" value="${sdk.dir}/tools" /> <property name="android.platformtools.dir" value="${sdk.dir}/platform-tools" /> <property name="android.platforms.dir" value="${sdk.dir}/platforms/${target}" /> <property name="android.tools.absolute.dir" location="${android.tools.dir}" /> <property name="android.platformtools.absolute.dir" location="${android.platformtools.dir}" /> <property name="android.platforms.absolute.dir" location="${android.platforms.dir}" /> <!-- 定义工具 <property name="verbose" value="false" />--> <condition property="exe" value=".exe" else=""> <os family="windows" /> </condition> <property name="jar.proguard" value="${proguard}" /> <property name="android-jar" value="${android.platforms.absolute.dir}/android.jar" /> <property name="android-dx" value="${android.platformtools.absolute.dir}/dx.bat" /> <property name="android-apkbuilder" value="${android.tools.absolute.dir}/apkbuilder.bat" /> <property name="android-adb" value="${android.platformtools.absolute.dir}/adb${exe}" /> <property name="android.zipalign" value="${android.tools.absolute.dir}/zipalign${exe}" /> <property name="android-aapt" value="${android.platformtools.absolute.dir}/aapt${exe}" /> <property name="android-jarsigner" value="${JAVA_HOME}/bin/jarsigner${exe}" /> <!-- ANT环境变量 --> <property environment="env" /> <!-- 生成R文件的相对目录 --> <property name="outdir-gen" value="${project.home}/gen" /> <!-- 编译后的文件放置目录 --> <property name="outdir-bin" value="${project.home}/bin" /> <!-- 输出目录 --> <property name="outdir" value="${project.outdir}" /> <!-- 清单文件 --> <property name="manifest-xml" value="${project.home}/AndroidManifest.xml" /> <!-- 源文件目录 --> <property name="resource-dir" value="res" /> <property name="asset-dir" value="assets" /> <!-- 资源文件目录 --> <property name="drawable-dir" value="${resource-dir}/drawable" /> <property name="drawable-hdpi-dir" value="${resource-dir}/drawable-hdpi"/> <property name="drawable-ldpi-dir" value="${resource-dir}/drawable-ldpi"/> <property name="drawable-mdpi-dir" value="${resource-dir}/drawable-mdpi"/> <property name="drawable-zh-rCN-dir" value="${resource-dir}/drawable-zh-rCN"/> <!-- java源文件目录 --> <property name="srcdir" value="src" /> <property name="srcdir-ospath" value="${project.home}/${srcdir}" /> <!-- 动态库so文件目录 --> <property name="library" value="${project.home}/libs" /> <!-- 第三方library --> <property name="library-dir1" value="${library1}" /> <property name="library-dir3" value="${library3}" /> <!-- 外部类库所在目录 --> <property name="external-lib" value="lib" /> <property name="external-lib-ospath" value="${project.home}/${external-lib}" /> <!-- 生成class目录 --> <property name="outdir-classes" value="${outdir-bin}/classes" /> <property name="outdir-classes-ospath" value="${outdir-classes}" /> <!-- classes.dex相关变量 --> <property name="dex-file" value="classes.dex" /> <property name="dex-path" value="${outdir-bin}/${dex-file}" /> <property name="dex-ospath" value="${dex-path}" /> <!-- 经过aapt生成的资源包文件 --> <property name="resources-package" value="${outdir-bin}/resources.ap_" /> <property name="resources-package-ospath" value="${resources-package}" /> <!-- 未认证apk包 --> <property name="out-unsigned-package" value="${outdir-bin}/${appName}-unsigned.apk" /> <property name="out-unsigned-package-ospath" value="${out-unsigned-package}" /> <!-- 证书文件 --> <property name="keystore-file" value="${keystore}" /> <!-- 已认证apk包 --> <property name="out-signed-package" value="${outdir-bin}/${appName}.apk" /> <property name="out-signed-package-ospath" value="${out-signed-package}" /> <!-- 已优化apk包 --> <property name="zipalign-signed-package" value="${outdir-bin}/${appName}${version}_release.apk" /> <!-- 输出路径的apk包 --> <property name="outdir-package" value="${project.outdir}/${appName}.apk" /> <!-- 初始化工作 --> <target name="init"> <echo>Initializing all output directories...</echo> <delete dir="${outdir-bin}" /> <delete dir="${outdir-gen}" /> <delete dir="${library-dir1}/bin" /> <delete dir="${library-dir3}/bin" /> <delete dir="${library-dir1}/gen" /> <delete dir="${library-dir3}/gen" /> <mkdir dir="${outdir-gen}" /> <mkdir dir="${outdir-bin}" /> <delete dir="${library-dir1}/bin" /> <delete dir="${library-dir3}/bin" /> <delete dir="${library-dir1}/gen" /> <delete dir="${library-dir3}/gen" /> <mkdir dir="${outdir-classes}" /> <!-- 把缺少的BuildConfig复制进去,暂时不知道如何生成 --> </target> <!-- 根据工程中的资源文件生成R.java文件 ,多个合并为一个--> <target name="GenRJAVA" depends="init"> <echo>Generating R.java / Manifest.java from the resources...</echo> <exec executable="${android-aapt}" failonerror="true"> <arg value="package" /><!-- package表示打包--> <arg value="-m" /><!--m,J,gen表示创建包名的目录和R.java到gen目录下 --> <arg value="-J" /> <arg value="${outdir-gen}" /> <arg value="-M" /><!-- M指定AndroidManifest.xml文件--> <arg value="${manifest-xml}" /> <arg value="-S" /><!-- S指定res目录,生成对应的ID,可多个--> <arg value="${resource-dir}" /> <arg value="-S" /> <arg value="${library-dir1}/res" /> <!-- 注意点:同时需要调用Library的res--> <arg value="-S" /> <arg value="${library-dir3}/res" /> <arg value="--extra-packages" /> <arg value="slidingmenu_library:SMSSDK" /> <arg value="-I" /><!-- I指定android包的位置--> <arg value="${android-jar}" /> <arg value="--auto-add-overlay" /> <!-- 这个重要,覆盖资源,不然报错--> </exec> </target> <!-- 将工程及库应用中的java源文件编译成class文件 --> <target name="compile" depends="GenRJAVA"> <echo>Compiling java source code...</echo> <javac encoding="UTF-8"target="1.6" destdir="${outdir-classes}" bootclasspath="${android-jar}" includeantruntime="on"> <src path="${library-dir1}/src" /><!-- 库应用源码 --> <src path="${outdir-gen}" /><!-- 生成的class文件全部保存到bin/classes目录下 --> <classpath> <fileset dir="${library-dir1}/libs" includes="*.jar" /><!-- 第三方jar包需要引用,用于辅助编译 --> </classpath> </javac> <javac encoding="UTF-8" destdir="${outdir-classes}" bootclasspath="${android-jar41}" includeantruntime="on"> <src path="${library-dir3}/src" /> <src path="${outdir-gen}" /> <classpath> <fileset dir="${library-dir3}/libs" includes="*.jar" /> </classpath> </javac> <javac encoding="UTF-8" destdir="${outdir-classes}" bootclasspath="${android-jar}"> <src path="${project.home}/src" /><!-- 工程源码--> <src path="${outdir-gen}" /><!-- 生成的class文件全部保存到bin/classes目录下 --> <classpath> <fileset dir="${library}" includes="*.jar" /><!-- 第三方jar包需要引用,用于辅助编译 --> </classpath> </javac> </target> <!--执行代码混淆和优化 必须在java文件编译以后--> <target name="optimize" depends="compile"> <echo>optimize classes are put to "${out.absolute.dir}" .</echo> <jar basedir="${outdir-classes}" destfile="${outdir-bin}/temp.jar"/> <taskdef resource="proguard/ant/task.properties" classpath="${jar.proguard}" /> <proguard> -injars ${outdir-bin}/temp.jar -outjars ${outdir-bin}/optimized.jar -libraryjars ${android-jar} -optimizationpasses 5 -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -include proguard-project.txt </proguard> <delete file="${outdir-bin}/temp.jar"/> <delete dir="${outdir-classes}" failonerror="false" /> <mkdir dir="${outdir-classes}"/> <unzip src="${outdir-bin}/optimized.jar" dest="${outdir-classes}"/> <delete file="${outdir-bin}/optimized.jar"/> </target> <!-- 将.class文件转化成.dex文件 --> <target name="dex" depends="compile"> <echo>Converting compiled files and external libraries into ${outdir-dx}test.dex...</echo> <exec executable="${android-dx}" failonerror="true"> <arg value="--dex" /> <arg value="--output=${dex-ospath}" /><!-- 输出 --> <arg path="${outdir-classes}" /><!-- classes文件位置 --> <arg value="${library}" /> <!-- 把libs下所有jar打包 --> </exec> </target> <!-- 将资源文件放进输出目录 --> <target name="package-res-and-assets"> <echo>Packaging resources and assets...</echo> <exec executable="${android-aapt}" failonerror="true"> <arg value="package" /> <arg value="-f" /><!-- 资源覆盖重写 --> <arg value="-M" /> <arg value="${manifest-xml}" /> <arg value="-S" /> <arg value="${resource-dir}" /> <arg value="-S"/> <arg value="${library-dir1}/res"/> <arg value="-S"/> <arg value="${library-dir3}/res"/> <arg value="-A" /><!-- asset目录也打包 --> <arg value="${asset-dir}" /> <arg value="-I" /> <arg value="${android-jar}" /> <arg value="-F" /><!-- 输出资源压缩包 --> <arg value="${resources-package}" /> <arg value="--auto-add-overlay" /> </exec> </target> <!-- 打包成未签证的apk --> <target name="package" depends="dex,package-res-and-assets"> <echo>Packaging unsigned apk for release...</echo> <exec executable="${android-apkbuilder}" > <arg value="${out-unsigned-package-ospath}" /><!-- 输出 --> <arg value="-u" /><!-- u指创建未签名的包--> <arg value="-z" /><!-- 资源压缩包 --> <arg value="${resources-package-ospath}" /> <arg value="-f" /><!-- dex文件 --> <arg value="${dex-ospath}" /> <arg value="-nf"/><!-- 把libs下的so库打包 --> <arg value="${library}" /> </exec> <echo>It will need to be signed with jarsigner before being published.</echo> </target> <!-- 对apk进行签证 --> <target name="jarsigner" depends="package"> <echo>Packaging signed apk for release...</echo> <exec executable="${android-jarsigner}" failonerror="true"> <arg value="-keystore" /> <arg value="${keystore-file}" /> <arg value="-storepass" /> <arg value="111111" /><!-- 验证密钥完整性的口令,创建时建立的 --> <arg value="-keypass" /> <arg value="111111" /> <!-- 专用密钥的口令,就是key密码 --> <arg value="-signedjar" /> <arg value="${out-signed-package-ospath}" /><!-- 输出 --> <arg value="${out-unsigned-package-ospath}" /><!-- 未签名的apk --> <!-- 不要忘了证书的别名 --> <arg value="recyclersign" /> </exec> <echo message="签名成功" /> </target> <!-- 优化 --> <target name="optimize-app" depends="jarsigner"> <echo> optimizing the application...</echo> <exec executable="${android-zipalign}"> <arg value="-v" /> <arg value="-f" /> <arg value="4" /> <arg value="${out-signed-package-ospath}" /> <arg value="${zipalign-signed-package}" /> </exec> </target> <!-- 发布 --> <target name="release" depends="optimize-app"> <!-- 删除未签证apk --> <delete file="${out-unsigned-package-ospath}" /> <echo>APK is released. path:${out-signed-package-ospath}</echo> <copy file="${out-signed-package-ospath}" tofile="${outdir-package}"></copy> <echo>APK is copy to path:${outdir-package}</echo> </target> </project> ``` ```
微信小程序主页面Page 调用setData之后,自定义控件里面的匿名函数对象变成null
微信小程序主页面Page 调用setData之后,由于这个变量是用于自定义控件的属性的,导致自定义控件也刷新了,但是有一些值就变成null了 Page的html ``` <list wx:for='{{WaitData}}' lists='{{item}}' ></list> ``` Page的js ``` var _ob = { title: res[i].ClassName + '(' + res[i].ClassCode + ')', data: _data, fn:function(){ }, // val: res[i], needDel: true, aaa:[function(){ console.log("111") }], delFn: function(a) { console.log(a) }, btns: [{ text: "操作1", fn: function(a) { console.log(a) }, val: res[i].TermYName }, { text: "操作2", fn: function(a) { console.log(a) }, val: res[i].TermYName }] }; DataFromt.push(_ob); console.log(DataFromt) //这里打印出来的匿名函数fn都是有值的 that.setData({ WaitData: DataFromt }); console.log(DataFromt) //这个也有 ``` 自定义控件的属性 ``` properties: { lists: { type: Object, value: {} } }, ``` 但是现在是主页setData之后,在自定义控件里面打印这个lists,里面定义的匿名函数全都没了。 我没搞懂为啥 我在主页随便弄的一个测试的代码试了一下,我发现他可以设置匿名函数的 ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556462794_665844.png) 下面是我发生问题的图片 ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556462945_356949.png) ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556463482_818309.jpg)
关于java static变量初始化的疑问
java中,类的static变量作为类变量,只需要被一次初始化,就可使用,但是,我在程序中遇到一个问题: 在web.xml中配置listener,服务器启动时,ServletContextListen初始化数据源(DataSource),第一次初始化成功,但是在Test类中,调用ConnectionManager.getConnection()时,DataSource却为null,意味着ServletContextListen初始化数据源失败了,大家帮忙解答下,到底什么原因造成的,谢谢!!! 以下是代码: [code="java"] package c3p0.connection; import java.beans.PropertyVetoException; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class ConnectionManager { private static DataSource data_source=null;; private static Properties props=null; private static String porps_name=null; /** * 创建数据库连接池 * @return */ private static DataSource createDataSource(){ load(); data_source=initDB(); return data_source; } /** * 加载配置文件 */ private static void load(){ try { props = new Properties(); InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream(porps_name); props.load(in); } catch (IOException e) { e.printStackTrace(); } } /** * 初始化数据库 */ private static DataSource initDB(){ System.out.println("开始初始化数据源..."); ComboPooledDataSource pool_ds=new ComboPooledDataSource(); try { pool_ds.setDriverClass(getProperty("c3p0.connection.driverClass")); } catch (PropertyVetoException e) { e.printStackTrace(); throw new RuntimeException("数据库驱动加载失败"); } pool_ds.setJdbcUrl(getProperty("c3p0.connection.url")); pool_ds.setUser(getProperty("c3p0.connection.user")); pool_ds.setPassword(getProperty("c3p0.connection.password")); pool_ds.setInitialPoolSize(Integer.parseInt(getProperty("c3p0.connection.initialPoolSize"))); pool_ds.setMaxPoolSize(Integer.parseInt(getProperty("c3p0.connection.maxPoolSize"))); pool_ds.setMinPoolSize(Integer.parseInt(getProperty("c3p0.connection.minPoolSize"))); pool_ds.setMaxIdleTime(Integer.parseInt(getProperty("c3p0.connection.maxIdleTime"))); pool_ds.setAcquireIncrement(Integer.parseInt(getProperty("c3p0.connection.acquireIncrement"))); pool_ds.setAcquireRetryAttempts(Integer.parseInt(getProperty("c3p0.connection.acquireRetryAttempts"))); pool_ds.setAcquireRetryDelay(Integer.parseInt(getProperty("c3p0.connection.acquireRetryDelay"))); pool_ds.setTestConnectionOnCheckout(Boolean.parseBoolean(getProperty("c3p0.connection.testConnectionOnCheckout"))); pool_ds.setTestConnectionOnCheckin(Boolean.parseBoolean(getProperty("c3p0.connection.testConnectionOnCheckin"))); pool_ds.setIdleConnectionTestPeriod(Integer.parseInt(getProperty("c3p0.connection.idleConnectionTestPeriod"))); pool_ds.setCheckoutTimeout(Integer.parseInt(getProperty("c3p0.connection.checkoutTimeout"))); pool_ds.setAutomaticTestTable(getProperty("c3p0.connection.automaticTestTable")); System.out.println("数据源初始化完毕..."); return pool_ds; } /** * 获取c3p0连接池文件配置信息 * @param key * @return */ private static String getProperty(String key){ if(key==null||"".equals(key)){ throw new NullPointerException("key不能为空!!!请检查key的赋值!!!"); } return props.getProperty(key); } public static Connection getConnection() throws SQLException{ data_source=(data_source==null) ? createDataSource() : data_source; return data_source.getConnection(); } public static void start(String porps_name) throws SQLException{ ConnectionManager.porps_name=porps_name; Connection conn=getConnection(); conn.close(); } public static void stop(){ data_source=null; } public static void release(Connection conn,PreparedStatement pstmt,ResultSet res){ try { if(conn!=null){ conn.close(); } if(pstmt!=null){ pstmt.close(); } if(res!=null){ res.close(); } } catch (SQLException e) { e.printStackTrace(); } } } [/code] [code="java"] package mystruts.listener; import java.sql.SQLException; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import c3p0.connection.ConnectionManager; /** * ServletContext 上下文监听器 * 应用服务器一启动就产生该对象,服务器关闭即销毁 * 作用于全局,所有Servlet ,相当于静态变量 * @author tianly * */ public class ServletContextListen implements ServletContextListener { /** * web服务器关闭时执行 */ @Override public void contextDestroyed(ServletContextEvent event) { /** * 关闭数据源 */ ConnectionManager.stop(); } /** * web服务器启动时执行 */ @Override public void contextInitialized(ServletContextEvent event) { /** * 初始化数据源 */ String db_url=event.getServletContext().getInitParameter("DataBaseConfig"); try { ConnectionManager.start(db_url); } catch (SQLException e) { e.printStackTrace(); } } } [/code] [code="java"] package test.c3p0; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import c3p0.connection.ConnectionManager; import c3p0.util.DateUtil; public class Test { /** * @param args */ public static void main(String[] args) { String currdate=DateUtil.getDateTime(); Connection conn=null; PreparedStatement pstmt=null; ResultSet res=null; try { String sql="insert into userinfo(username,password,sex,regdate) values(?,?,?,?)"; String sql4ID="select LAST_INSERT_ID()"; conn=ConnectionManager.getConnection(); conn.setAutoCommit(false); pstmt=conn.prepareStatement(sql); pstmt.setString(1, "tly"); pstmt.setString(2, "tly"); pstmt.setInt(3, 0); pstmt.setString(4, currdate); //mysql中无需进行日期格式转换 pstmt.executeUpdate(); pstmt=conn.prepareStatement(sql4ID); res=pstmt.executeQuery(); if(res.next()){ int ID=res.getInt(1); System.out.println("ID:"+ID); } conn.commit(); } catch (SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } }finally{ ConnectionManager.release(conn, pstmt, res); } } } [/code] [code="xml"] <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>mysystem</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 登录Servlet配置 <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>login.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> --> <filter> <filter-name>ActionDispatcher</filter-name> <filter-class> mystruts.actionfilter.ActionDispatcher</filter-class> </filter> <filter-mapping> <filter-name>ActionDispatcher</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- 数据库信息配置 --> <context-param> <param-name>DataBaseConfig</param-name> <param-value>c3p0/c3p0.properties</param-value> </context-param> <listener> <listener-class>mystruts.listener.ServletContextListen</listener-class> </listener> </web-app> [/code] 在Test类中,调用ConnectionManager.getConnection()时,DataSource却为null,但我在debug时,跟踪查看,发现DataSource是被初始化了,不知什么原因造成初始化失败,请大家帮忙查看下,谢谢
想参考springside实现Hibernate的零配置,但提示错误:org.hibernate.hql.ast.QuerySyntaxException
想参考Springside实现Hibernate的零配置文件,写了一个简单的测试用例,查询一张表(数据库表名为TB_USER,对应的实体类名为User),但是出错如下: org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [from User] 错误提示是说我的“from User”语句中“User”未建立映射。在网上查过,类似的问题一般是因为类名的大小写错误或者配置文件错误,导致类名和数据库表名没有建立映射关系,但我似乎没有这类问题。好几天了找不到原因,不知道哪里的配置有毛病,以下是相关代码 测试用例如下: [code="java"] import org.springframework.beans.factory.annotation.Autowired; import org.springside.modules.test.junit38.SpringTransactionalTestCase; import accountant.entity.User; public class DaoTest extends SpringTransactionalTestCase { @Autowired org.springside.modules.orm.hibernate.HibernateDao<User, Long> dao ; //列出所有User表记录 public void testUserList() { //试过把完整包名带上,写成“from accountant.entity.User”,还是一样的错误 dao.find("from User", null); } } [/code] User类代码如下,其中@Table(name="TB_USER")指明对应的数据库表是“TB_USER”,这张表在库中确定存在,并有两条记录 [code="java"] package accountant.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Table(name="TB_USER") public class User { String name; String id; String sex; String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } [/code] applicationContext.xml中的数据库相关配置如下,其中 “<property name="packagesToScan" value="accountant.entity.*" />”是指定自动扫描实体类的包,User类也就在“accountant.entity”这个包下 [code="java"] <!-- 数据源配置,使用应用内的DBCP数据库连接池。--> <!--这里数据库的连接应该是没问题的,因为出错时提示的是Hql执行错误,说明数据库连接已经成功建立了,不过是执行的语句有问题 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- Connection Pooling DBCP --> <property name="initialSize" value="5" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="1000" /> <property name="poolPreparedStatements" value="true" /> <property name="defaultAutoCommit" value="false" /> </bean> <!-- Hibernate配置--> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="namingStrategy"> <bean class="org.hibernate.cfg.ImprovedNamingStrategy" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider </prop> </props> </property> <property name="packagesToScan" value="accountant.entity.*" /> </bean> <!-- Dao类 --> <bean id="hibernateDao" class="org.springside.modules.orm.hibernate.HibernateDao"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> [/code] 相关的代码就是以上三处,不知道哪里有遗漏或是错误,请指点一二,非常感谢! [b]问题补充:[/b] [code="java"][/code] 先谢谢二位,我的spring和hibernate的jar版本如下: [img]/upload/attachment/124016/5a67b24b-27e0-348a-ab6f-5d7003972509.gif[/img] [img]/upload/attachment/124018/751e247e-4c6c-341f-9859-4a52863af90d.gif[/img] 这个小例子是在springside的mini-web范例上直接改的,应该环境方面不会有大问题吧 to layer555: springside的mini-web的applicationContext.xml是这样的: [code="java"] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" default-lazy-init="true"> <description>Spring公共配置文件 </description> <!-- 定义受环境影响易变的变量 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <!-- 标准配置 --> <value>classpath*:/application.properties</value> <!-- 本地开发环境配置 --> <value>classpath*:/application.local.properties</value> <!-- 服务器生产环境配置 --> <!-- <value>file:/var/myapp/application.server.properties</value> --> </list> </property> </bean> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --> <context:component-scan base-package="org.springside.examples.miniweb" /> <!-- 数据源配置,使用应用内的DBCP数据库连接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- Connection Pooling DBCP --> <property name="initialSize" value="5" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="1000" /> <property name="poolPreparedStatements" value="true" /> <property name="defaultAutoCommit" value="false" /> </bean> <!-- 数据源配置,使用应用服务器的数据库连接池 --> <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />--> <!-- Hibernate配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="namingStrategy"> <bean class="org.hibernate.cfg.ImprovedNamingStrategy" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop> </props> </property> <property name="packagesToScan" value="org.springside.examples.miniweb.entity.*" /> </bean> <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 事务管理器配置,多数据源JTA事务--> <!-- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or WebLogicJtaTransactionManager" /> --> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans> [/code] 这里面也没有configurationClass,也能正常,不知道在什么地方设置或默认了 to xuzhfa123: 改了你说的两处,确实可以跑通了,非常感谢。但搞不明白的是,在上面贴的mini-web的配置文件中是这么写的: [code="java"]<property name="packagesToScan" value="org.springside.examples.miniweb.entity.*" /> [/code] 这个例子是可以正常运行的,为什么我就必须改成 [code="java"] <property name="packagesToScan" value="accountant.entity" /> [/code] 才可以呢?
CLASSPATH中的jar包
有个问题,就是MyEclipse中新建一个Java Project或者Web Project,然后如何获取它的CLASSPATH下的所有jar包的名字? ps: 问题标签的分类不对啊~! [b]问题补充:[/b] 有个问题,就是MyEclipse中新建一个Java Project或者Web Project,然后如何获取它的CLASSPATH下的所有jar包的名字? ps: 问题标签的分类不对啊~! [quote] 你可以用System.getProperty得到环境变量的值,然后用java.io.File找到里面所有的文件。 [/quote] 这个可以的. [quote] 工程的classpath全部在工程根目录下的.classpath文件中呢,点号开头,可以通过分析这个入手,另外,这个文件中有些classpath配置项目是引用的eclipse环境变量,eclipse环境变量可以通过JDT提供的API获取真实的所有jar包 [/quote] 这个办法无法获取web容器中的classpath中的jar包 Properties p = System.getProperties(); Set<?> s = p.keySet(); for (Iterator<?> iterator = s.iterator(); iterator.hasNext();) { String key = (String) iterator.next(); String value = p.getProperty(key); if(key.equals("java.class.path")){ String[] jar = value.split(";"); for (int i = 0; i < jar.length; i++) { System.out.println(jar[i]); } } }
maven配置spring-mvc请求到不了controller
最近自己想用maven搭建spring-mvc项目,按照结构搭建的最后请求到不了 ``` controller 2015-06-17 17:29:30 [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Bound request context to thread: org.apache.catalina.connector.RequestFacade@1e70f68 2015-06-17 17:29:30 [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] DispatcherServlet with name 'spring' processing GET request for [/MavenDemo/index.do] 2015-06-17 17:29:30 [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@7d554f59] in DispatcherServlet with name 'spring' 2015-06-17 17:29:30 [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping]-[DEBUG] No handler mapping found for [/index.do] 2015-06-17 17:29:30 [org.springframework.web.servlet.DispatcherServlet]-[DEBUG] Testing handler map [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping@2c0ea67] in DispatcherServlet with name 'spring' 2015-06-17 17:29:30 [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping]-[DEBUG] No handler mapping found for [/index.do] ``` 下面是配置: web.xml ``` <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/spring.xml; </param-value> </context-param> <!-- 设计路径变量值 --> <context-param> <param-name>webAppRootKey</param-name> <param-value>springmvc.root</param-value> </context-param> <!-- Spring字符集过滤器 --> <filter> <filter-name>SpringEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>SpringEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 日志记录 --> <context-param> <!-- 日志配置文件路径 --> <param-name>log4jConfigLocation</param-name> <param-value>classpath:conf/log4j.properties</param-value> </context-param> <context-param> <!-- 日志页面的刷新间隔 --> <param-name>log4jRefreshInterval</param-name> <param-value>6000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- springMVC核心配置 --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/spring-mvc.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> ``` spring-mvc.xml ``` <context:component-scan base-package="com.tarena"/> <mvc:annotation-driven/> <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 对模型视图添加前后缀 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/> ``` UserController.java ``` package com.tarena.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/") public class UserController { @RequestMapping("index") public String index(){ return "index"; } } ``` tomcat启动起来之后访问http://localhost:8080/MavenDemo可以正常跳转到欢迎页面,但是http://localhost:8080/MavenDemo/index.do就不能跳转到对应页面了。
怎么判断当前取出的数据是数据库相应的表中的最后一条
是这样的,我有一个jsp界面, ``` setInterval(function (){ $.post(url,data,function() { do something }); },2000); ``` 这段代码主要是每隔两秒就像Struts2的action发出一次请求,从而获取数据库中的数据。 第一次获取数据库第一条记录的数据,第二次第二条,以此类推。假设我现在数据库有N条数据,我希望定时器获取了N次信息之后把定时器清除,要怎么做?数据库操作采用的是hibernate。(ps:不想每次都select count(*) 这样可以做到么)下面来个郁闷的测试代码。main函数如下: ``` String properties[]={"sensorInputDataID","value","valueType"}; List<Object[]> list=baceDao.getSpecifiedRanges(SensorInputData.class, properties,"201","1"); for(Object[] obj:list) { System.out.println("id="+obj[0].toString()+", value="+obj[1].toString()+",valueType="+obj[2].toString()); } if(list==null) { System.out.println("null"); } ``` 其中bacedao的getSpecifiedRanges代码如下 ``` public List<Object[]> getSpecifiedRanges(Class<? extends Object> table,String[] properties,String startIndex,String rowCount) { int propertysLength= properties.length; String hql="select "; for(int i=0;i<propertysLength-1;i++) { hql+=properties[i]+","; } hql+=properties[propertysLength-1]+" from "+table.getSimpleName(); System.out.println(hql); List<Object[]> result=sessionFactory.getCurrentSession().createQuery(hql).setFirstResult(Integer.parseInt(startIndex)).setMaxResults(Integer.parseInt(rowCount)).list(); return result; } ``` 执行之后,后台信息如下(我数据库只有200条记录): ![图片说明](https://img-ask.csdn.net/upload/201506/03/1433322463_526337.png) 好像都没有比较好的方案。我本来是想在数据库取到N+1条的时候,报错,然后抓取这个错误来解决的。可惜后台根本不报错。 我现在的方案是,开始的时候查一次数据库的count(*),并将其赋给变量rowCount。当前记录为index,第一次取数据,index为1,第二次为2以此类推。当index==rowCount的时候,再查一次count(*),若此时rowCount>index,则定时器继续执行,迭代上述步骤。否则清除定时器。
这种错怎么解决突然报的404 导入之前的项目或者都复制过来都不报错 新建一个jsp页面就报404
7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server.服务器版本: Apache Tomcat/9.0.19 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server.构建: Apr 12 2019 14:22:48 UTC 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version number: 9.0.19.0 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Name: Windows 10 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS.版本: 10.0 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: 结.造: amd64 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Java 环境变量: C:\Program Files\Java\jre-9.0.4 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM 版本: 9.0.4+11 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM.供应商: Oracle Corporation 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_BASE: E:\mybatis\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_HOME: E:\mytomcat\apache-tomcat-9.0.19 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.base=E:\mybatis\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.home=E:\mytomcat\apache-tomcat-9.0.19 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dwtp.deploy=E:\mybatis\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps 7月 24, 2019 9:10:26 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dfile.encoding=UTF-8 7月 24, 2019 9:10:26 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: Loaded APR based Apache Tomcat Native library [1.2.21] using APR version [1.6.5]. 7月 24, 2019 9:10:26 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. 7月 24, 2019 9:10:26 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true] 7月 24, 2019 9:10:26 下午 org.apache.catalina.core.AprLifecycleListener initializeSSL 信息: OpenSSL successfully initialized [OpenSSL 1.1.1a 20 Nov 2018] 7月 24, 2019 9:10:26 下午 org.apache.coyote.AbstractProtocol init 信息: 初始化协议处理器 ["http-nio-8080"] 7月 24, 2019 9:10:27 下午 org.apache.coyote.AbstractProtocol init 信息: 初始化协议处理器 ["ajp-nio-8009"] 7月 24, 2019 9:10:27 下午 org.apache.catalina.startup.Catalina load 信息: 服务器在[1,274]毫秒内初始化 7月 24, 2019 9:10:27 下午 org.apache.catalina.core.StandardService startInternal 信息: Starting service [Catalina] 7月 24, 2019 9:10:27 下午 org.apache.catalina.core.StandardEngine startInternal 信息: Starting Servlet engine: [Apache Tomcat/9.0.19] 7月 24, 2019 9:10:27 下午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom 警告: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [171] milliseconds. 7月 24, 2019 9:10:32 下午 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplicationInitializer types detected on classpath 7月 24, 2019 9:10:33 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 7月 24, 2019 9:10:33 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext 7月 24, 2019 9:13:04 下午 org.apache.ibatis.mapping.VendorDatabaseIdProvider getDatabaseId 严重: Could not get a databaseId from dataSource java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseProductName(VendorDatabaseIdProvider.java:76) at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseName(VendorDatabaseIdProvider.java:61) at org.apache.ibatis.mapping.VendorDatabaseIdProvider.getDatabaseId(VendorDatabaseIdProvider.java:49) at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:395) at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:295) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4682) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5150) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(Unknown Source) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:902) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1377) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1367) at java.base/java.util.concurrent.FutureTask.run(Unknown Source) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(Unknown Source) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:902) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:932) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:633) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492) Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ... 50 more WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.apache.ibatis.reflection.Reflector (file:/E:/mybatis/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/aa/WEB-INF/lib/mybatis-3.2.2.jar) to method java.lang.Object.finalize() WARNING: Please consider reporting this to the maintainers of org.apache.ibatis.reflection.Reflector WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release 7月 24, 2019 9:13:05 下午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring FrameworkServlet 'springmvc' 7月 24, 2019 9:13:06 下午 org.apache.coyote.AbstractProtocol start 信息: 开始协议处理句柄["http-nio-8080"] 7月 24, 2019 9:13:06 下午 org.apache.coyote.AbstractProtocol start 信息: 开始协议处理句柄["ajp-nio-8009"] 7月 24, 2019 9:13:06 下午 org.apache.catalina.startup.Catalina start 信息: Server startup in [159,538] milliseconds web配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMybatisOa</display-name> <!-- dwr --> <servlet> <servlet-name>dwr_invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>crossDomainSessionSecurity</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr_invoker</servlet-name> <url-pattern>/dwre/*</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springconfig/*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app> springmvc配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/><!-- 启动注解方式的mvc --> <context:component-scan base-package="action"/><!-- 扫描该包下所有类加载到容器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> </beans> spring配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:jdbc.properties"></property> </bean> <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${driverClass}" /> <property name="jdbcUrl" value="${url}" /> <property name="user" value="${userName}" /> <property name="password" value="${passWord}" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="ds" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="ds" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath:dao/*.xml"></property> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="dao" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <context:component-scan base-package="biz.impl"/> </beans> 在线等 急!!!
web scoket在线聊天,服务连接失败
# 这是java里的代码 package com.webSocket; import net.sf.json.JSONObject; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.websocket.*; /** * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端 */ @ServerEndpoint(value = "/webSocketOneToOne/{param}") public class WebSocketOneToOne { // 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount; //实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key为用户标识 private static Map<String,WebSocketOneToOne> connections = new ConcurrentHashMap<>(); // 与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; private String role; private String socketId; /** * 连接建立成功调用的方法 * * @param session * 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(@PathParam("param") String param, Session session) { this.session = session; String[] arr = param.split(","); this.role = arr[0]; //用户标识 this.socketId = arr[1]; //会话标识 connections.put(role,this); //添加到map中 addOnlineCount(); // 在线数加 System.out.println("有新连接加入!新用户:"+role+",当前在线人数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { connections.remove(role); // 从map中移除 subOnlineCount(); // 在线数减 System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message * 客户端发送过来的消息 * @param session * 可选的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); JSONObject json=JSONObject.fromObject(message); String string = null; //需要发送的信息 String to = null; //发送对象的用户标识 if(json.has("message")){ string = (String) json.get("message"); } if(json.has("role")){ to = (String) json.get("role"); } send(string,role,to,socketId); } /** * 发生错误时调用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } //发送给指定角色 public static void send(String msg,String from,String to,String socketId){ try { //to指定用户 WebSocketOneToOne con = connections.get(to); if(con!=null){ if(socketId==con.socketId||con.socketId.equals(socketId)){ con.session.getBasicRemote().sendText(from+"说:"+msg); } } //from具体用户 WebSocketOneToOne confrom = connections.get(from); if(confrom!=null){ if(socketId==confrom.socketId||confrom.socketId.equals(socketId)){ confrom.session.getBasicRemote().sendText(from+"说:"+msg); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketOneToOne.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketOneToOne.onlineCount--; } } ``` # 这是前段页面代码 <%-- Created by IntelliJ IDEA. User: Administrator Date: 2019/10/9 0009 Time: 下午 4:19 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <script> var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { var url = "ws://localhost:8080/webSocket/webSocketOneToOne/1,123" websocket = new WebSocket(url); } else { alert('当前浏览器 Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function() { setMessageInnerHTML("WebSocket连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function() { setMessageInnerHTML("WebSocket连接成功"); } //接收到消息的回调方法 websocket.onmessage = function(event) { console.log("回调信息",event.data) setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function() { setMessageInnerHTML("WebSocket连接关闭"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function() { closeWebSocket(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //关闭WebSocket连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; //message作为发送的信息,role作为发送的对象标识,socketId是此次会话的标识 websocket.send(JSON.stringify({'message': message, 'role': '2', 'socketId': "123"})); } </script> <input id="text" type="text" /> <button οnclick="send()">发送消息</button> <button οnclick="closeWebSocket()">关闭WebSocket连接</button> <div id="message"></div> </body> </html> ``` # 这是依赖 ``` <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib-ext-spring</artifactId> <version>1.0.2</version> </dependency> </dependencies> ``` ![图片说明](https://img-ask.csdn.net/upload/201910/09/1570619693_439462.png) 运行之后就是这样![图片说明](https://img-ask.csdn.net/upload/201910/09/1570619784_298966.png) ``` ```
Struts2 OGNL表达式访问普通类的构造方法取不出值
ognl.jsp代码 ``` <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>OGNL</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> Ognl Page!<br/> <ol> <li>访问值栈中的普通属性 取出username:<s:property value="username"/></li> <li>访问值栈中的普通属性 取出password:<s:property value="password"/></li> <li>访问值栈中的对象的属性 取出user.Age:<s:property value="user.age"/></li> <li>访问值栈中的对象的属性 取出cat.dog.name:<s:property value="cat.dog.name"/></li> <li>访问值栈中的成员变量的普通方法 取出password的长度:<s:property value="password.length()"/></li> <li>访问值栈中的对象的普通方法 取出cat.miaomiao:<s:property value="cat.miaomiao()"/></li> <li>访问值栈中的action的普通方法 取出helloaction:<s:property value="helloaction()"/></li> </ol> <hr> <ol> <li>访问静态成员:<s:property value="@com.mytest.ognl.S@staticStr"/></li> <li>访问静态方法:<s:property value="@com.mytest.ognl.S@StaticMethord()"/></li> <!-- 静态方法的访问应该在配置struts.xml中配置 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> 默认的default.properties中属性值是false --> <li>访问Math类的方法:<s:property value="@@max(2,9)"/></li> <!-- 访问Math类的方法时候用两个@@符号,只限于访问Math类 --> </ol> <hr> <ol> <li>访问普通类的构造方法:<s:property value="new com.mytest.ognl.User(8)"/></li> </ol> <hr> <ol> <li></li> </ol> <s:debug></s:debug> </body> </html> ``` User.java代码 ``` package com.mytest.ognl; public class User { private int Age; public User(){} public User(int Age){ super(); this.Age=Age; } public void setAge(int age) { Age = age; } public int getAge() { return Age; } public String toString(){ return "user" + Age; } } ``` 执行结果: ![图片说明](https://img-ask.csdn.net/upload/201607/18/1468808591_928039.jpg) 访问普通类的构造方法:那个地方的值总是取不出来?怎么回事呀?求大神帮忙给解决下。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问