从URL读取text文件返回字符串

从我本地服务器中读取的text文件,其中有字符串。

NSString *vers= [NSString stringWithContentsOfURL:[NSURL URLWithString:lnk] encoding:NSUTF8StringEncoding error:nil];

返回的字符串有误,服务器中的数字是1371135679,应用中读取的就是1371133137。

不知道为什么会这样?谢谢。

2个回答

最简单的方法是用HTTP缓存,添加?t=<timestamp>到request中。

 [[NSURLCache sharedURLCache] removeAllCachedResponses];
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Springmvc上传文件限制大小,异常处理返回报错信息后,eclipse控制台还报错
**1、web.xml配置:** ``` <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 注册主控制器DispatcherServlet --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定spring配置文件位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.from</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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> ``` **spring的applicationContext.xml配置:** ``` <?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:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 定义自动扫描组件 --> <context:component-scan base-package="controller"></context:component-scan> <!-- 定义@RequestMapping映射的注解驱动 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 定义视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <!-- 注册spring web mvc中处理上传事件的组件CommonsMultipartResolver, 而具体怎样处理上传文件,则是由导入的包common-upload.jar和common-io.jar去处理--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10240"></property> <property name="resolveLazily" value="true"></property> </bean> </beans> ``` **java代码Controller处理:** ``` package controller; import java.io.File; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; @Controller public class UploadController { // 访问upload.jsp页面 @RequestMapping("/toUpload") public String toUpload() { return "upload"; } @RequestMapping("/upload") public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request, ModelMap model) throws Exception { // 判断提交来的文件是否为空 if (file.isEmpty()) { // model.addAttribute("error", "上传文件不能为空"); // return "upload"; throw new RuntimeException("file is null"); } // 获取文件所要保存目录在服务器上所对应的实际路径 String path = request.getSession().getServletContext().getRealPath( "upload"); System.out.println(path); // 组成拥有真实路径的一个完整的地址字符串 String fileUrl = path + "\\" + file.getOriginalFilename(); // 封装上传文件名称到model对象中 model.addAttribute("fileName", file.getOriginalFilename()); // 根据这个完整地址字符串,生成提交文件所要保存到的目标文件或目录的对象 File targetFile = new File(fileUrl); // 判断目标文件或目录的对象是否已经存在 if (!targetFile.exists()) { targetFile.mkdirs(); } // 传送文件到目标对象 file.transferTo(targetFile); System.out.println("已上传文件:" + file); return "ok"; } @ExceptionHandler public ModelAndView doException(Exception e,HttpServletRequest request) throws Exception { Map<String,Object> map = new HashMap<String,Object>(); if (e instanceof MaxUploadSizeExceededException) { long maxSize = ((MaxUploadSizeExceededException) e) .getMaxUploadSize(); map.put("error", "上传文件太大,不能超过" + maxSize / 1024 + "k"); }else if(e instanceof RuntimeException){ map.put("error", "未选中文件"); }else{ map.put("error", "上传失败"); } return new ModelAndView("upload",map); } } ``` **上传文件页面upload.jsp:** ``` <%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>上传页面</title> </head> <body> <form action="upload.from" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="submit" value="上传"/><font color="red">${error}</font> </form> </body> </html> ``` **上传成功页面ok.jsp:** ``` <%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>ok.jsp</title> </head> <body> <h1>上传成功</h1> <a href="upload/${fileName}">${fileName}</a> </body> </html> ``` **eclipse控制台报错信息如下:** ``` 五月 01, 2015 10:27:01 下午 org.springframework.web.multipart.commons.CommonsMultipartResolver cleanupMultipart 警告: Failed to perform multipart cleanup for servlet request org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 10240 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (19243) exceeds the configured maximum (10240) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160) at org.springframework.web.multipart.commons.CommonsMultipartResolver$1.initializeMultipart(CommonsMultipartResolver.java:131) at org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest.getMultipartFiles(AbstractMultipartHttpServletRequest.java:119) at org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest.getMultiFileMap(AbstractMultipartHttpServletRequest.java:99) at org.springframework.web.multipart.commons.CommonsMultipartResolver.cleanupMultipart(CommonsMultipartResolver.java:188) at org.springframework.web.servlet.DispatcherServlet.cleanupMultipart(DispatcherServlet.java:1062) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2476) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2465) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (19243) exceeds the configured maximum (10240) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914) at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156) ... 37 more ``` 上传文件超过限制大小,异常处理后页面返回了提示信息“上传文件太大,不能超过10k”,但是为啥eclipse的控制台还是有报错呢?
php如何读取rss,即url地址的xml
并且读取xml后,返回数据给js,因为是通过ajax传递url给php解析,php将解析后的数据返回给js操作,请问如何返回数据给js以便操作呢?? ps:url就是一个rss地址 [b]问题补充:[/b] php读取xml代码如下: <?php //RSS源地址列表数组 /*$rssfeed = $_GET["url"]; if($rssfeed == ""){ $rssfeed = "http://rss.sina.com.cn/news/allnews/sports.xml"; }*/ $rssfeed = array("http://news.163.com/special/r/00011K6L/rss_newstop.xml", "http://rss.sina.com.cn/news/allnews/sports.xml", "http://ent.163.com/special/00031K7Q/rss_toutiao.xml", "http://tech.163.com/special/00091JPQ/techimportant.xml"); //设置编码为UTF-8 header('Content-Type:text/html;charset= UTF-8'); for($i=0;$i<sizeof($rssfeed);$i++){//分解开始 $buff = ""; $rss_str = ""; //打开rss地址,并读取,读取失败则中止 $fp = fopen($rssfeed[$i],"r") or die("can not open $rssfeed"); while ( !feof($fp) ) { $buff .= fgets($fp,4096); } //关闭文件打开 fclose($fp); //建立一个 XML 解析器 $parser = xml_parser_create(); //xml_parser_set_option -- 为指定 XML 解析进行选项设置 xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); //xml_parse_into_struct -- 将 XML 数据解析到数组$values中 xml_parse_into_struct($parser,$buff,$values,$idx); //xml_parser_free -- 释放指定的 XML 解析器 xml_parser_free($parser); foreach ($values as $val) { $tag = $val["tag"]; $type = $val["type"]; $value = $val["value"]; //标签统一转为小写 $tag = strtolower($tag); if ($tag == "item" && $type == "open"){ $is_item = 1; }else if ($tag == "item" && $type == "close") { //构造输出字符串 $rss_str .= "<a href='".$link."' target=_blank>".$title."</a><br />"; $is_item = 0; } //仅读取item标签中的内容 if($is_item==1){ if ($tag == "title") {$title = $value;} if ($tag == "link") {$link = $value;} } } //输出结果 echo $rss_str."<br />"; } ?> 但是总是十分不稳定,有时能读出,有时显示fopen读取错误,并且用ajax传递url过来时,一直都是现实fopen错误。。。 是不是php的一个bug???有其他函数稳定些的吗? 听说可以用curl,请问curl怎么用??
python3 用pdfminer3k爬取PDF文件不完整,请问有什么解决方法吗?
最近在用Python爬交易所公告的PDF文件,参考了论坛上各位大神的介绍,安装了pdfminer3k,并成功解析了PDF文件。不过我发现有些PDF文件解析的时候只能解析一部分内容出来,大段的文字没有解析出来,请问是什么问题,有什么解决方案吗?查了好久没找到类似的问题,感谢大家! 下面是我的代码: # -*- coding: utf-8 -*- from urllib.request import Request from urllib.request import quote from urllib.request import urlopen import pandas as pd from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LTTextBoxHorizontal, LAParams from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfinterp import PDFTextExtractionNotAllowed from pdfminer.pdfparser import PDFParser, PDFDocument headers = {'content-type': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'} baseurl = "http://" def parse(docucode, txtcode): try: # 打开在线PDF文档 #_path = baseurl + quote(docucode) + "?random=0.3006649122149502" _path = baseurl + quote(docucode) request = Request(url=_path, headers=headers) # 随机从user_agent列表中抽取一个元素 fp = urlopen(request,timeout=500) #timeout设置超时的时间,防止出现访问超时问题 # 读取本地文件 # path = './2015.pdf' # fp = open(path, 'rb') # 用文件对象来创建一个pdf文档分析器 praser_pdf = PDFParser(fp) # 创建一个PDF文档 doc = PDFDocument() # 连接分析器 与文档对象 praser_pdf.set_document(doc) doc.set_parser(praser_pdf) # 提供初始化密码doc.initialize("123456") # 如果没有密码 就创建一个空的字符串 doc.initialize() # 检测文档是否提供txt转换,不提供就忽略 if not doc.is_extractable: raise PDFTextExtractionNotAllowed else: # 创建PDf资源管理器 来管理共享资源 rsrcmgr = PDFResourceManager() # 创建一个PDF参数分析器 laparams = LAParams() # 创建聚合器 device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 创建一个PDF页面解释器对象 interpreter = PDFPageInterpreter(rsrcmgr, device) # 循环遍历列表,每次处理一页的内容 # doc.get_pages() 获取page列表 for page in doc.get_pages(): # 使用页面解释器来读取 interpreter.process_page(page) # 使用聚合器获取内容 layout = device.get_result() # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, # LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性, for out in layout: # 判断是否含有get_text()方法,图片之类的就没有 # if ``hasattr(out,"get_text"): docname = str(txtcode).split('.')[0]+'.txt' with open(docname, 'a') as f: if isinstance(out, LTTextBoxHorizontal): results = out.get_text() #print(results) f.write(results) except Exception as e: #抛出超时异常 print("a", str(e)) pdfurl = 'www.sse.com.cn/disclosure/credibility/supervision/inquiries/opinion/c/8135857143683813.pdf' txtname = 'ceshi' parse(pdfurl, txtname)
web 通讯 des加密 中文乱码
通讯: 客户端将上行通过des加密,秘钥url挂参传输。服务器接收到客户端的上行进行解密,不论中英文都是正常的。 然后,服务器将下行des加密,响应到客户端,客户端解密之后就出现中文乱码。(不存在秘钥不正确之说) response响应时:response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("utf-8"); debug调试 response.getWriter(); 的编码格式也是utf-8. 在客户端接收到输入流,得到的编码格式也是utf-8,读取出来得到的字符串与服务器加密得到的字符串是一致的,但是客户端解密之后,就会出现中文乱码。谢谢各位大牛。小弟拜谢!
刚搭的ssm框架,不能直接通过url访问WEB-INF下的html
如下图,我不能直接通过地址栏的url去访问HTML页面. ![图片说明](https://img-ask.csdn.net/upload/201708/09/1502243574_813631.png) 以下是我的配置: # web.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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Archetype Created Web Application</display-name> <!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止Spring内存溢出监听器 --> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 --> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> # spring-mybatis.xml <?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd "> <!-- <context:annotation-config /> --> <!-- 自动扫描 --> <!-- <context:component-scan base-package="com.lizhm" /> --> <context:component-scan base-package="**.*.services"/> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" > <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 连接池最大数量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 连接池最大空闲 --> <property name="maxIdle" value="${maxIdle}"></property> <!-- 连接池最小空闲 --> <property name="minIdle" value="${minIdle}"></property> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath*:/**/*Mapper.xml"></property> </bean> <!-- DAO(services)接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="**.*.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置基于注解的声明式事务 --> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> </beans> # spring-mvc.xml <?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <context:annotation-config/> <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --> <context:component-scan base-package="**.*.controllers" /> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 配置SpringMVC --> <!-- 1.开启SpringMVC注解模式 --> <!-- 简化配置: (1)自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter (2)提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持 --> <mvc:annotation-driven/> <!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 --> <mvc:default-servlet-handler/> <!-- <mvc:resources mapping="/lib/**" location="/lib/" /> --> <mvc:resources mapping="/resources/**" location="/resources/" /> <!-- <mvc:resources mapping="/WEB-INF/view/**" location="/WEB-INF/view/" /> --> <!-- 定义跳转的文件的前后缀 ,视图模式配置--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> --> <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".html" /> </bean> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> </beans>
想做一个文库网站,下载了一个MTCEO文库系统的源码,有一段读取SWF的代码不太懂,求大神帮助
function geturlipstr($ext,$filename){//获得预览代码,本地模式 if(file_exists('./' . C('mtceo_attach_path')."docswf/data/".$filename.".php")){ $ipstr=F($filename,'','./' . C('mtceo_attach_path').'docswf/data/'); }else{ $urlarr=array(); $urlarr[0]=$ext; $urlarr[1]=$filename; $urlarr[2]=C('mtceo_site_url'); $urlpost=join('|',$urlarr); $data=file_get_contents('http://www.mtceo.net/index.php?m=common&a=getipstr&u='.$urlpost); $ipstrarr=json_decode($data,true); if($ipstrarr['status']==0){ $ipstr="<div class=\"stl_01 mod reader-page complex reader-page-\"><div style=\"height:300px;font-size:30px;color:red;padding-top:150px;font-weight:bolder;text-align:center;\">".$ipstrarr['info']."</div></div>"; }else{ $ipstr=$ipstrarr['info']; F($filename,$ipstr,'./' . C('mtceo_attach_path').'docswf/data/');//缓存文件 } } return $ipstr; } function getipstr($ext,$filename){//获得预览代码,本地模式 $extarr=array('xls','xlsx','ppt','pptx','dps','et'); if(in_array($ext, $extarr)){ $pngname='./' . C('mtceo_attach_path').'docswf/data/'.$filename.'/01.png'; $filepath='./' . C('mtceo_attach_path').'docswf/data/'.$filename.'/'; if(!file_exists('./' . C('mtceo_attach_path')."docswf/data/".$filename.".php")){ if(file_exists($pngname)){//如果该文档存在,则取出字符串 $opendir=opendir($filepath); $ipstr="<!--[if IE]> <html class='ie'> <![endif]--><link rel='stylesheet' type='text/css' href='./public/images/docstyle.css' />"; while ($file=readdir($opendir)){ if(is_file($filepath.$file)){ if(strpos($filepath.$file, '.png')){ $ipstr.="<div class=\"stl_01 mod reader-page complex reader-page-\"><img src='".$filepath.$file."' /></div>"; } } }//经过循环已经得到$ipstr代码了 F($filename,$ipstr,'./' . C('mtceo_attach_path').'docswf/data/');//缓存文件 } else{ //如果没有该文件则显示未生成预览 $ipstr="<div class=\"stl_01 mod reader-page complex reader-page-\"><div style=\"height:300px;font-size:30px;color:red;padding-top:150px;font-weight:bolder;text-align:center;\">该文档尚未生成预览</div></div>"; } }//如果不存在缓存文件的判断结束 else{ $ipstr=F($filename,'','./' . C('mtceo_attach_path').'docswf/data/'); }//存在缓存文件的判断结束 }//以下将为生成html预览的部分 else{ $htmlname='./' . C('mtceo_attach_path').'docswf/data/'.$filename.'.html'; if(!file_exists('./' . C('mtceo_attach_path')."docswf/data/".$filename.".php")){ if(file_exists($htmlname)){//如果该文档存在,则取出字符串 $ipstr=file_get_contents(HOST.__ROOT__ . '/' . C('mtceo_attach_path').'docswf/data/'.$filename.'.html'); $ipstr=str_replace("<!DOCTYPE html>", '', $ipstr); $ipstr=str_replace("<html>", '', $ipstr); $ipstr=str_replace("</html>", '', $ipstr); $ipstr=str_replace("<meta charset=\"utf-8\" />", '', $ipstr); $ipstr=str_replace("<title>", '', $ipstr); $ipstr=str_replace("</title>", '', $ipstr); $ipstr=str_replace("<head>", '', $ipstr); $ipstr=str_replace("</head>", '', $ipstr); $ipstr=str_replace("<body>", '', $ipstr); $ipstr=str_replace("</body>", '', $ipstr); $ipstr=str_replace($filename.'_files', './' . C('mtceo_attach_path').'docswf/data/'.$filename.'_files', $ipstr); $ipstr=str_replace('stl_01', 'stl_01 mod reader-page complex reader-page-', $ipstr); //得到ipstr F($filename,$ipstr,'./' . C('mtceo_attach_path').'docswf/data/');//缓存文件 } else{ //如果没有该文件则显示未生成预览 $ipstr="<div class=\"stl_01 mod reader-page complex reader-page-\"><div style=\"height:300px;font-size:30px;color:red;padding-top:150px;font-weight:bolder;text-align:center;\">该文档尚未生成预览</div></div>"; } }//如果不存在缓存文件的判断结束 else{ $ipstr=F($filename,'','./' . C('mtceo_attach_path').'docswf/data/'); }//存在缓存文件的判断结束 } return $ipstr; }
ext tree 如何根据json对象生成节点?
<p>var jsondata = [ { <br>                        id: '111', <br>                        text: '文件夹1_1', </p> <p>                        children: [] <br>                    },{ <br>                        id: '222', <br>                        text: '文件夹1_2', <br>                        children: [] <br>                   } <br>];</p> <p> 我现在有上面这样一个json格式的对象jsondata,有一个ext tree 对象,tree对象有一个根节点,tree对象的根节点默认不展开,当点击加号展开时,将jsondada加载为其下的子节点。简单点说,ext tree 加载节点的方式通常是请求服务器print一个json格式的字符串,或者请求一个.json文件,而我现在是在页面上有一个json格式的对象,如何能让tree读取这个json对象来生成节点,而不请求任何外部url。我设想的思路是,实际上就是动态加载树节点,但动态请求的不是url,可以是一个方法,返回一个json格式的对象,类似上面的jsondata。ext tree对象有没有这样的实现方式啊,或者有其他的途径可以解决我的需求!</p>
数据填充到表单的问题
JS代码如下 Ext.onReady( function(){ var urls = '/struts2-1.6/forminfoaction-json!setlist.action'; var formPanel = new Ext.form.FormPanel({ labelAlign:'right', title:'form', labelWidth:50, frame:true, width:220, url:'10-01.txt', reader: new Ext.data.JsonReader({ root: 'data' },[ {name: 'names',mapping:'names',type:'string'} ]), items:[{ xtype: 'textfield', fieldLabel: '文本', name: 'names' }], buttons:[{ text:'读取', handler:function(){ formPanel.getForm().load({url:urls, waitMsg:'Saving Data...'}); } }] }); formPanel.render("form"); }); JSON返回值 {"data":{"names":"form赋值"}} 点击了“读取”按钮后,form中的控件还是没有办法赋值上去。 网上资料找了不少,貌似我代码没写错啊,为啥不行呢。。 :cry: :cry: [b]问题补充:[/b] 还是不行啊,关键地方没写错啊 :cry: :cry: [b]问题补充:[/b] '10-01.txt'也是一个json字符串,我单独写的文本。不过一样不行。。
最近在对接海康9800平台,我用rest 有问题,他们说应该用soap 请问我这算不算soap
public void haha(String sss) throws Exception { String wsdl = "http://10.0.9.103/vms/services/VmsSdkWebService"; int timeout = 10000; StringBuffer sb = new StringBuffer(""); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); sb.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<soapenv:Body>" + "<applyToken xmlns=\"http://ws.vms.ivms6.hikvision.com\"> " + "<arg0 xmlns=\"\"> "+sss+" </arg0>" + "</applyToken> " + "</soapenv:Body>" + "</soapenv:Envelope>" ); // 打印请求soap System.out.println("Soap:" + sb.toString()); // HttpClient发送SOAP请求 HttpClient client = new HttpClient(); PostMethod postMethod = new PostMethod(wsdl); // 设置连接超时 client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout); // 设置读取时间超时 client.getHttpConnectionManager().getParams().setSoTimeout(timeout); // 然后把Soap请求数据添加到PostMethod中 RequestEntity requestEntity = new StringRequestEntity(sb.toString(), "text/xml", "UTF-8"); //设置请求头部,否则可能会报 “no SOAPAction header” 的错误 postMethod.setRequestHeader("SOAPAction","applyToken"); // 设置请求体 postMethod.setRequestEntity(requestEntity); int status = client.executeMethod(postMethod); // 打印请求状态码 System.out.println("status:" + status); // 获取响应体输入流 InputStream is = postMethod.getResponseBodyAsStream(); // 获取请求结果字符串 String result = IOUtils.toString(is,"UTF-8"); System.out.println("result: " + HikUtils.getResault(result)); // HttpURLConnection 发送SOAP请求 System.out.println("HttpURLConnection 发送SOAP请求"); URL url = new URL(wsdl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestMethod("POST"); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); conn.setConnectTimeout(timeout); conn.setReadTimeout(timeout); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.write(sb.toString().getBytes("utf-8")); dos.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); String line = null; StringBuffer strBuf = new StringBuffer(); while ((line = reader.readLine()) != null) { strBuf.append(line); } dos.close(); reader.close(); System.out.println(strBuf.toString()); }
js 加上alert就成功执行,不加就不对??
``` @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <script src="~/echarts/build/source/echarts.js"></script> <script src="~/echarts/build/dist/echarts.js"></script> <script src="~/Scripts/jquery-1.7.1.js"></script> <script src="~/Scripts/jquery-1.7.1.min.js"></script> <title>echartLineJson</title> <script type="text/javascript"> //ajax获取后台数据,x轴的name从数据库中读取 function fetchXname() { var arr = new Array(); $.ajax( { url: "/DropDownTree/echartLineJsonTest", dataType: "text", success: function (data) { //调用函数获取值,转换成数组模式 var ss = eval(data); for (var i = 0; i < ss.length; i++) { //alert(ss[i].name); arr.push(ss[i].name); } } }); return arr; } //最高气温 function dataXRand() { var dataarr = new Array(); $.ajax({ url: "/DropDownTree/echartLineJsonTest", dataType: "text", success: function (data) { var ss = eval(data); for (var i = 0; i < ss.length; i++) { dataarr.push(ss[i].data2); } } }); alert(dataarr); //在此处加上alert()就成功,取消显示结果就不正确?? // window.setTimeout(function () { return dataarr; },1000); return dataarr; } //option配置 var option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigger: 'axis' }, legend: { data: ['最高气温', '最低气温'] }, toolbox: { show: true, feature: { mark: { show: true }, dataView: { show: true, readOnly: false }, magicType: { show: true, type: ['line', 'bar'] }, restore: { show: true }, saveAsImage: { show: true } } }, calculable: true, xAxis: [ { type: 'category', boundaryGap: false, data: fetchXname() } ], yAxis: [ { type: 'value', axisLabel: { formatter: '{value} °C' } } ], series: function () { }, series: [ { name: "最高气温", type: 'line', data: dataXRand(), markPoint: { data: [ { type: 'max', name: '最大值' }, { type: 'min', name: '最小值' } ] }, markLine: { data: [ { type: 'average', name: '平均值' } ] } }, { name: '最低气温', type: 'line', data: [1, -2, 2, 5, 2, 3, -1.5], markPoint: { data: [ { name: '周最低', value: -2, xAxis: 1, yAxis: -1.5 } ] }, markLine: { data: [ { type: 'average', name: '平均值' } ] } } ] }; // 路径配置 require.config({ paths: { echarts: '/echarts/build/dist' } }); //使用 require( [ 'echarts', 'echarts/chart/line' //line为折线图, 使用柱状图就加载bar模块,按需加 ], function (ec) { // 基于准备好的dom,初始化echarts图表 var myChart = ec.init(document.getElementById('main')); // 为echarts对象加载数据 myChart.setOption(option); myChart.hideLoading(); } ); </script> </head> <body> <div> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px"></div> <input id="jsontest" /> </div> </body> </html> ``` 具体代码如上所示,在最高气温dataXRand函数内的alert()加上就成功执行,不加就不对。前台接收的是后台传过来的json字符串 正确执行的结果如下图所示 ![图片说明](https://img-ask.csdn.net/upload/201504/09/1428570225_10305.png) 请问这种情况应该如何解决?
http Client 出现生僻字
<pre name="code" class="java"> //cookie HttpSession session=request.getSession(); Object cookie=null; cookie=session.getAttribute(KEY_COOKIE); //设置header PostMethod method = new PostMethod(url); if(cookie!=null){ method.setRequestHeader("Cookie", ""+cookie); } Enumeration en=request.getHeaderNames(); while(en.hasMoreElements()){ String n=(String)en.nextElement(); String v=request.getHeader(n); method.setRequestHeader(n, v); } method.setRequestHeader("content-length", ""+content.getBytes().length); System.out.println("[RailUtil]Request:\n" + content + "\n"); //设置内容 method.setRequestBody(content); method.setRequestHeader("Content-type", "text/xml; charset=GBK"); //Client org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient(); client.getParams().setContentCharset("GBK"); //设置超时 5秒 client.setTimeout(TIMEOUT); //发送请求 try { client.executeMethod(method); } catch (HttpException e1) { // TODO Auto-generated catch block e1.printStackTrace(); throw new Exception("连接超时或信道错误",e1); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); throw new Exception("连接超时或信道错误",e1); } //保存 cookie Header newCookieHeader = method.getResponseHeader("Set-Cookie"); if(newCookieHeader!=null) session.setAttribute(KEY_COOKIE, newCookieHeader.getValue()); //输出返回 StringBuilder sb_res=new StringBuilder(); InputStream bis=null; try{ bis=method.getResponseBodyAsStream(); byte[] bb=new byte[1024]; int len_res=0; while((len_res=bis.read(bb))&gt;0){ //bb = new String(bb, "GB2312").getBytes("GBK"); sb_res.append(new String(bb,0,len_res)); } }catch(IOException e){ throw new Exception("读取返回信息失败",e); }finally{ if(bis!=null)bis.close(); } </pre> <p> </p> <p>代码如上,应该可以看得明白。现在问题是返回的字符串,我是用xml格式存放信息,其中部分中文字被转换为生僻字,这个是什么原因呢?</p><br /><strong>问题补充:</strong><br />to lovewhzlq <br />如何指定正确的编码呢?返回的字符串可以检测到编码方式么?
尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,求大神帮忙指正
java新人,尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,调用 insert 指令没问题,而 select 指令出现如下报错: com.microsoft.sqlserver.jdbc.SQLServerException: ')' 附近有语法错误。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:792) at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:689) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(SQLServerStatement.java:616) at com.javaee.servletxm.comm.MSSQLJDBC.select(MSSQLJDBC.java:160) at com.javaee.servletxm.comm.MSSQLJDBC.select(MSSQLJDBC.java:195) at com.javaee.servletxm.comm.MSSQLJDBC.selectFirstValue(MSSQLJDBC.java:172) at com.javaee.servletxm.comm.MSSQLJDBC.getPageNumber(MSSQLJDBC.java:221) at com.javaee.servletxm.comm.MSSQLJDBC.selectByFY(MSSQLJDBC.java:259) at com.javaee.servletxm.kqgl.KqManager.getAllKqxx(KqManager.java:38) at com.javaee.servletxm.kqgl.Kqwh.doGet(Kqwh.java:47) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:617) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1760) at java.lang.Thread.run(Thread.java:724) 这是具体的代码,求大神帮忙指正 package com.javaee.servletxm.comm; /** * jdbc下 SQL Server 2005 数据库的封装类 */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.List; import java.util.Properties; public class MSSQLJDBC { // 配置文件名称 private String iniFileName = MSSQLJDBC.class.getClassLoader().getResource("/com/javaee/servletxm/comm").getPath()+ "mssql.properties"; // 连接数据库 private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private String url = "jdbc:sqlserver://localhost;DatabaseName=jdms"; private String user = "sa"; private String password = ""; // 定义连接属性 private Connection connect = null; // 与连接有关三个通道 private Statement stmt = null; private PreparedStatement pstmt = null; private CallableStatement cstmt = null; public static final String stmtType = "stmt"; public static final String pstmtType = "pstmt"; public static final String cstmtType = "cstmt"; // 定义参数类型的静态常量值 public static final String varCharType = "varchar"; public static final String intType = "int"; public static final String doubleType = "decimal"; public static final String dateType = "datetime"; public static final String timeType = "timestamp"; // 定义全局的结果集 private ResultSet rs = null; // 在构造方法中对属性进行初始化赋值操作 public MSSQLJDBC() { // 读取配置文件 readIni(); // 初始化连接 initConnect(); } // 可配置文件 .properties // 读取配置文件 private void readIni() { File file = new File(iniFileName); if (!file.exists()) { // 创建一个文件 try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } // 判断文件是否有值 if (file.length() == 0) {// 说明是一个空文件 // 初始化值 try { Properties p = new Properties(); p.put("driver", driver); p.put("url", url); p.put("user", user); p.put("password", password); FileOutputStream fos = new FileOutputStream(file); p.store(fos, "配置文件信息"); fos.close(); } catch (IOException e) { e.printStackTrace(); } } else {// 如果有值 // 将信息读取出来 try { FileInputStream fis = new FileInputStream(file); Properties p = new Properties(); p.load(fis); this.driver = p.getProperty("driver"); this.url = p.getProperty("url"); this.user = p.getProperty("user"); this.password = p.getProperty("password"); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } // 建立连接 private void initConnect() { try { Class.forName(driver); this.connect = DriverManager.getConnection(url, user, password); this.connect.setAutoCommit(false);// 设置手动提交事务 this.stmt = connect.createStatement(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /*/ 从tomcat缓冲池获取连接 private void initConnectFromDataSource() { try { InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/oracleds"); this.connect = ds.getConnection(); this.connect.setAutoCommit(false); this.stmt = connect.createStatement(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } }*/ // 需要调用者控制事务的两个方法 // 提交方法 private void commit() { try { this.connect.commit(); } catch (SQLException e) { e.printStackTrace(); } } // 回滚事务 private void rollBack() { try { this.connect.rollback(); } catch (SQLException e) { e.printStackTrace(); } } // 定义一组与操作有关的方法 // 使用普通通道执行的select public ResultSet select(String sql) { ResultSet prs = null; if (stmt != null) { try { prs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } } return prs; } // 根据传入的sql直接获取单一值 // 使用此方法的时候sql语句返回的单一的值 public String selectFirstValue(String sql, String type, List<String> csList) { String rstr = ""; rs = select(sql, type, csList);// 确定此结果集只有一条记录 if (rs != null) {// 说明结果集有值,且只有一条记录 try { ResultSetMetaData rsmd = rs.getMetaData(); if (rs.next()) { // 移动到第一条记录 String p_type = rsmd.getColumnTypeName(1); rstr = getResultSetValue(rs, 1, p_type); } } catch (SQLException e) { e.printStackTrace(); } } return rstr; } // 使用普通通道执行的select /** * sql 参数 type 使用通道的类型 stmt pstmt cstmt List<String> csList 预编通道执行的参数队列 * String 最少必须满足如下条件的字符串 数据类型 ,数据值 数据类型定义说明 字符串 数字(整数、小数) 日期(DATE、TIMESTAMP) */ public ResultSet select(String sql, String type, List<String> csList) { ResultSet prs = null; if (type.equals(stmtType)) {// 说明使用普通通道来执行 prs = select(sql); } else if (type.equals(pstmtType)) {// 说明使用预编译通道来执行 if (connect != null) { try { pstmt = connect.prepareStatement(sql); // 验证传入的参数和sql中的参数个数一致 setPrepareStatement(pstmt, csList);// 将参数设置进当前的预编译通道 prs = pstmt.executeQuery(); } catch (Exception e) { e.printStackTrace(); } } } return prs; } // 获取 总页数 public int getPageNumber(String sql, String type, List<String> csList, int pageSize) { // 处理总页数 int pageNumber = 0; // 第一步获取sql总记录数 String psql = "select count(*) from (" + sql + ")"; String result = selectFirstValue(psql, type, csList); int rows = 0; if (result != null && result.trim() != "") { rows = Integer.valueOf(result); } if (rows % pageSize == 0) { pageNumber = rows / pageSize; } else { pageNumber = rows / pageSize + 1; } return pageNumber; } /** * 自动添加分页查询方法 * * @param sql * 要执行的sql * @param type * 执行方式 * @param csList * 参数列表 * @param curPage * 当前页数 * @param pageSize * 每页记录数 默认为10 * @return */ public ResultSet selectByFY(String sql, String type, List<String> csList, int curPage, int pageSize) { ResultSet prs = null; // 处理 每页记录数 if (pageSize <= 0) { pageSize = 10;// 默认页面10条记录 } int pageNumber = getPageNumber(sql, type, csList, pageSize); // 处理当前页数 if (curPage < 0) { curPage = 1;// 默认第一页 } if (curPage > pageNumber) { curPage = pageNumber; } String psql = "select tmpaa.* from (select tmpa.*,(select (ROW_NUMBER() over (order by id))) as rn from (" + sql + ") tmpa where (select (ROW_NUMBER() over (order by id))) <= " + (curPage * pageSize) + ") tmpaa where tmpaa.rn >= " + ((curPage - 1) * pageSize + 1); prs = select(psql, type, csList); return prs; } // 将预编通道执行的参数队列按照指定规则设置进通道中 private void setPrepareStatement(PreparedStatement p, List<String> csList) throws Exception { if (csList != null && csList.size() > 0) { for (int i = 0; i < csList.size(); i++) { // 此处的str是数据类型 ,数据值 // 解析出数据类型和数据值 String[] s = csList.get(i).split(","); String sType = s[0]; String sData = s[1]; if (varCharType.equals(sType)) { p.setString(i + 1, sData); } else if (intType.equals(sType)) { p.setInt(i + 1, Integer.valueOf(sData)); } else if(doubleType.equals(sType)){ p.setDouble(i+1, Double.valueOf(sData)); } else if (dateType.equals(sType)) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); java.util.Date d = sdf.parse(sData); p.setDate(i + 1, new Date(d.getTime())); } else if (timeType.equals(sType)) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); java.util.Date d = sdf.parse(sData); p.setTimestamp(i + 1, new Timestamp(d.getTime())); } } } } // 定义一个执行insert update delete的方法 public int iudSql(String sql) { int ri = -1; if (stmt != null) { try { ri = stmt.executeUpdate(sql); commit(); } catch (SQLException e) { e.printStackTrace(); rollBack(); } } return ri; } public int iudSql(String sql, String type, List<String> csList) { int ri = -1; if (stmtType.equals(type)) { ri = iudSql(sql); } else if (pstmtType.equals(type)) { if (connect != null) { try { pstmt = connect.prepareStatement(sql); setPrepareStatement(pstmt, csList); ri = pstmt.executeUpdate(); commit(); } catch (Exception e) { e.printStackTrace(); rollBack(); } } } return ri; } /** * 编写一个通用的遍历ResultSet结果集的方法 */ public void iteratorResultSet(ResultSet rs) { try { if (rs != null) {// 说明有值 // ResultSetMetaData 此对象里封装了与结果集有关所有信息 // 此结果有几列组成,每列的列名,每列的数据类型 ResultSetMetaData rsmd = rs.getMetaData(); // 得到结果集列数 int columnCount = rsmd.getColumnCount(); // 输出此结果集的所有列名 for (int i = 1; i <= columnCount; i++) { System.out.print(rsmd.getColumnName(i) + "\t"); } System.out.println(""); // 遍历输出所有的数据 while (rs.next()) { // 如何在获取rs中的数据? for (int i = 1; i <= columnCount; i++) { String type = rsmd.getColumnTypeName(i); System.out.print(getResultSetValue(rs, i, type) + "\t"); } System.out.println(""); } } } catch (SQLException e) { e.printStackTrace(); } } // 从ResultSet中根据数据类型来得到数据值的方法 // 先处理常用的sqlserver的数据类型的对应 private String getResultSetValue(ResultSet rs, int index, String type) { String rstr = ""; try { if (rs != null && !"".equals(type) && index > 0) { if ("char".equals(type.trim()) || "varchar".equals(type.trim())) { if (rs.getString(index) != null) { rstr = rs.getString(index); } } else if ("int".equals(type.trim())) { rstr = rs.getInt(index) + ""; } else if ("decimal".equals(type.trim())) { rstr = String.valueOf(rs.getDouble(index)); } else if ("date".equals(type.trim())) { Date date = rs.getDate(index); if (date != null) { rstr = new SimpleDateFormat("yyyy年MM月dd日").format(date); } } else if ("timestamp".equals(type.trim()) || "datetime".equals(type.trim())) { Timestamp tt = rs.getTimestamp(index); if (tt != null) { rstr = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(tt); } } } } catch (SQLException e) { e.printStackTrace(); } return rstr; } /* //统一事务管理的批量sql的封装 public boolean iudSql(List<String> sqlList){ int ri = -1; if(stmt!=null){ try { ri = stmt.executeUpdate(sql); commit(); } catch (SQLException e) { e.printStackTrace(); rollBack(); } } return ri; }*/ // 关闭连接 public void close() { try { // 关闭所有的与数据库有关的对象 if (rs != null) { rs.close(); rs = null; } if (stmt != null) { stmt.close(); stmt = null; } if (pstmt != null) { pstmt.close(); pstmt = null; } if (cstmt != null) { cstmt.close(); cstmt = null; } if (connect != null) { connect.close(); connect = null; } } catch (SQLException e) { e.printStackTrace(); } } }
关于一个简单的代理服务器程序,运行程序出现错误,求解答,新手无从入手啊
求大家帮帮忙,我是真的一点也看不懂,而老师交代的不能不做,这个程序是网上载的,我调试后可跳出程序,但是运行程序会出错,因为本人什么也不懂,所以只能麻烦各位了。。需要提供什么材料可以说,最好能加下我Q:597305256 分不多,只能意思一下,帮忙解决的话万分感激,求大家帮个忙,真的是急了才没办法了。。 ![图片说明](https://img-ask.csdn.net/upload/201604/28/1461850110_862696.jpg) #include "StdAfx.h" #include "ProxyServer.h" #include "HttpProxyWnd.h" #define MAX_REQUEST 1024 * 4 #define MAX_HOST_NAME 128 #define DEFAULTPORT 80 #define HEADLEN 7 //http:// #define GET_METHOD_LEN 4 //GET_SPACE ProxyParam *ProxyPtr = NULL; TCHAR HeaderA[1024 * 4] = {0}; TCHAR HeaderB[1024 * 4] = {0}; CHAR HostList[1024 * 4] = {0}; System::String szProxy = _T("");//010.000.000.172:80 System::String szTimeout = _T("6000"); System::String szOrig = _T("010.000.000.001"); System::String szPort = _T("8008"); System::String szFilter = _T(""); TCHAR chNotifytext[1024*2] = {0}; Proxydata lproxydata; //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //Sunday算法。 //************************************************************************* //Sunday算法是比较快速的字符串匹配算法,比KMP和Booyer-moore算法都快,这三种算法都需要提前进行预处理, //Booyer-moore是反向比对字符串,Kmp和Sunday则是正向比对,各自的预处理方法都不同。 //Sunday算法主要思想是让指向主串的指针在匹配过程中,跳过尽可能多的长度,再和模式串进行匹配。平均状况下时 //间复杂度:O(主串长度/模式串长度) //************************************************************************* inline bool sunday(const char* ori ,const char* pat) { int i=0; int j=0; int olen=strlen(ori); int plen=strlen(pat); const int max_size=255; int next[max_size] = {0}; vector<int> res; for (i=0;i<max_size;++i) { next[i]=plen+1; } for (i=0;i<plen;++i){ next[pat[i]]=plen-i; } i=0; while(i<=olen-plen) { while(j<plen) { if (ori[i+j]!=pat[j]) { break; } ++j; } if (j==plen) { res.push_back(i); j=0; } i+=next[ori[i+plen]]; } if (0 < res.size()){ return true; } return false; } /// <summary> /// 根据字符串解析主机名称 端口 /// </summary> inline bool ParseHostName(char *RecvBuf, char *HostName, u_short *Port, bool *PortExsit) { char *pHost = strstr(RecvBuf, "Host: "); if (pHost == NULL) { return false; /*未能发现主机*/ } pHost += (sizeof("Host: ") - 1); char *pHostEnd = strstr(pHost, "\r\n"); if (pHostEnd == NULL) { return false; /*无效的主机*/ } int nHost = pHostEnd - pHost; if (nHost > MAX_HOST_NAME) { return false; /*无效的主机*/ } memcpy(HostName, pHost, nHost); HostName[nHost] = 0; char *pPort = strstr(HostName, ":"); if (pPort == NULL) { *Port = DEFAULTPORT; return true; } *Port = (u_short)atoi(pPort + (sizeof(":") - 1)); *PortExsit = true; HostName[pPort - HostName] = 0; return true; } /// <summary> /// 判断是否本地主机 /// </summary> inline bool IsLocalHost(char *Host) { int Length = ProxyPtr->LocalIP.Length; while(Length > 0) { if (strstr(Host, ProxyPtr->LocalIP.IP[Length - 1]) != NULL) { return true; }; Length -= 1; } return false; } /// <summary> /// 过滤关键字 /// </summary> inline void ErrorNetAddress(System::Net::Sockets *ClientSocket, char *Text) { char *pstr = "HTTP/1.1 502 Bad Gateway\r\n" "Content-Type: text/html\r\n" "Server: Easy-Proxy\r\n" "Connection: close\r\n\r\n" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n" "<HTML>\r\n<HEAD>\r\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=gb2312\">\r\n" "<TITLE>错误:您所请求的网址(URL)无法获取</TITLE>\r\n" "<STYLE type=\"text/css\"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}--></STYLE>\r\n" "</HEAD>\r\n<BODY>\r\n" "<H1>错误</H1>\r\n<H2>您所请求的网址(URL)无法获取</H2>\r\n" "<HR noshade buf_size=\"1px\">\r\n发生了下列的错误: \r\n" "<UL>\r\n<LI>\r\n<STRONG>\r\n"; int TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); if (Text == NULL){ Text = "您当前打开的网址含非法字符"; } TextLength = strlen(Text); ClientSocket->Send(Text, &TextLength); pstr = "\r\n</STRONG>\r\n</UL>\r\n请联系服务器管理员:<A HREF=\"mailto:123456@foxmail.com\">123456@foxmail.com</A>.\r\n" "<BR clear=\"all\">\r\n<HR noshade buf_size=\"1px\">\r\n" "<ADDRESS>\r\nGenerated by WTP/1.1 "; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); pstr = ProxyPtr->LocalIP.IP[ProxyPtr->LocalIP.Length - 1]; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); pstr = " (HTTP/1.1 GDGZ-PS-GW001-WAP01 (infoX-WISG, 123456 Technologies))\r\n</ADDRESS>\r\n</BODY>\r\n</HTML>"; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); ClientSocket->Shutdown(); } /// <summary> /// 显示一个错误网页给访问客户端 /// </summary> inline void ShowToClient(System::Net::Sockets *ClientSocket, char *Text) { char *pstr = "HTTP/1.1 502 Bad Gateway\r\n" "Content-Type: text/html\r\n" "Server: Easy-Proxy\r\n" "Connection: close\r\n\r\n" "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n" "<HTML>\r\n<HEAD>\r\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=gb2312\">\r\n" "<TITLE>错误:您所请求的网址(URL)无法获取</TITLE>\r\n" "<STYLE type=\"text/css\"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}--></STYLE>\r\n" "</HEAD>\r\n<BODY>\r\n" "<H1>错误</H1>\r\n<H2>您所请求的网址(URL)无法获取</H2>\r\n" "<HR noshade buf_size=\"1px\">\r\n发生了下列的错误: \r\n" "<UL>\r\n<LI>\r\n<STRONG>\r\n"; int TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); if (Text == NULL){ Text = "Text参数为null"; } TextLength = strlen(Text); ClientSocket->Send(Text, &TextLength); pstr = "\r\n</STRONG>\r\n</UL>\r\n本缓存服务器管理员:<A HREF=\"mailto:123456@foxmail.com\">123456@foxmail.com</A>.\r\n" "<BR clear=\"all\">\r\n<HR noshade buf_size=\"1px\">\r\n" "<ADDRESS>\r\nGenerated by WTP/1.1 "; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); pstr = ProxyPtr->LocalIP.IP[ProxyPtr->LocalIP.Length - 1]; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); pstr = " (HTTP/1.1 GDGZ-PS-GW001-WAP01 (infoX-WISG, 123456 Technologies))\r\n</ADDRESS>\r\n</BODY>\r\n</HTML>"; TextLength = strlen(pstr); ClientSocket->Send(pstr, &TextLength); ClientSocket->Shutdown(); } /// <summary> /// 判断主机名是否在白名单列表 /// </summary> inline bool IsInWhiteList(char *hostname) { char *p = HostList; char *p1; while((p1 = strstr(p, "\r\n")) != NULL) { p1[0] = 0; if (strstr(hostname, p) != NULL) { p1[0] = '\r'; return true; } p1[0] = '\r'; p = p1 + 2; } return false; } /// <summary> /// 读取数据包头 /// </summary> inline char *GetHeaderValueA(char *headers, char *name) { char *pheader = strstr(headers, name); if (pheader != NULL) { pheader += (strlen(name) + 2); char *pheaderEnd = strstr(pheader, "\r\n"); name = (char *)AppBase::Allocate((pheaderEnd - pheader) + 1,RLIB_FUCTION,RLIB_FILE); memcpy(name, pheader, (pheaderEnd - pheader)); pheader = name; } return pheader; } /// <summary> /// 读取数据包头 /// </summary> inline char *GetHeaderA(char *headers, char *name) { char *pheader = strstr(headers, name); if (pheader != NULL) { char *pheaderEnd = strstr(pheader, "\r\n"); name = (char *)AppBase::Allocate((pheaderEnd - pheader + 2) + 1, RLIB_FUCTION, RLIB_FILE); memcpy(name, pheader, (pheaderEnd - pheader + 2)); pheader = name; } return pheader; } /// <summary> /// 读取数据包头 /// </summary> inline TCHAR *GetHeader(TCHAR *headers, TCHAR *name) { TCHAR *pheader = _tcsstr(headers, name); if (pheader != NULL) { TCHAR *pheaderEnd = _tcsstr(pheader, T("\r\n")); name = (TCHAR *)AppBase::Allocate(TSIZE(pheaderEnd - pheader + 2), RLIB_FUCTION, RLIB_FILE); memcpy(name, pheader, TSIZE((pheaderEnd - pheader + 2)) - sizeof(TCHAR)); pheader = name; } return pheader; } /// <summary> /// 本地网页请求处理 /// </summary> inline void LocalProcess(char * /*RecvBuf*/, RequestParam *lpParameter) { //输出网页 ShowToClient(lpParameter->ClientSocket, "当前配置不允许请求内网数据"); } /// <summary> /// 接收请求 /// </summary> inline int RecvRequest(char **RecvBuf, int *pbuf_size, System::Net::Sockets * ClientSocket) { int buf_size = *pbuf_size; //缓冲区可用大小 bool retend = false; //是否收完请求头 \r\n\r\n之前 int retval = 0; //已接收大小 int retcur = 0; //最近一次接收大小 int postlen = 0; //记录POST数据大小(如果有) + 头部大小 BEGINRecv: while((retcur = ClientSocket->Recv(*RecvBuf + retval, buf_size)) > 0) { retval += retcur; if(!retend) //如果没收完头部 { char *pend = strstr(*RecvBuf, "\r\n\r\n"); if (pend != NULL) //收完头部 { if ((*RecvBuf)[0] != 'P') { //非POST方式 goto ENDRecv; } //以下默认为POST方式 char *post_len_str = GetHeaderValueA(*RecvBuf, "Content-Length"); if(post_len_str == NULL) { ShowToClient(ClientSocket, "POST关键字段丢失, 无法完成请求"); goto ERRORRecv; } postlen = atoi(post_len_str); AppBase::Collect(post_len_str); postlen += ((pend - *RecvBuf) + 4); retend = true; } //判断POST数据是否接收完毕 if (retend && (retval >= postlen)) { goto ENDRecv; } buf_size -= retcur; CHECK: if (buf_size <= 0) { buf_size += MAX_REQUEST; *pbuf_size += MAX_REQUEST; *RecvBuf = (char *)AppBase::ReAlloc(*RecvBuf, *pbuf_size); goto CHECK; } goto BEGINRecv; //循环直到收完头部 } //此处是POST数据的接收过程, 判断是否接收完毕 if (retval >= postlen) { goto ENDRecv; } buf_size -= retcur; CHECK_B: if (buf_size <= 0) { buf_size += MAX_REQUEST; *pbuf_size += MAX_REQUEST; *RecvBuf = (char *)AppBase::ReAlloc(*RecvBuf, *pbuf_size); goto CHECK_B; } } ShowToClient(ClientSocket, "接收请求时发生异常, 请检查客户端"); ERRORRecv: return 0; ENDRecv: return retval; } 还有一部分代码 好像这边打不进去了,麻烦大家帮帮忙好吗 求各位了 T T 我的QQ 597305256 真的是急了 不然不会那么唐突的
java 发送post请求,内容为xml
一个web service 提供了post请求方式,用户发送一个xml请求文档比如: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Execute> <Input> <owsIdentifier>name</owsIdentifier> <Data> <LiteralData>zhangsan</LiteralData> </Data> </Input> <ResponseForm> <RawDataOutput mimeType="text/xml"> <owsIdentifier>info</owsIdentifier> </RawDataOutput> </ResponseForm> </Execute> 服务端会返回zhangsan的信息。上面的xml文档在浏览器中通过post表单方式正常执行。 但是在java中就不行了java种代码如下: [code="java"] package common.post; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class PostTest { void testPost(String urlStr) { try { URL url=new URL(urlStr); URLConnection con=url.openConnection(); con.setDoOutput(true); OutputStreamWriter out=new OutputStreamWriter(con.getOutputStream()); String request=readFile(); System.out.println("Exedata satart\n"+request+"\nExe end"); out.write(new String(request.getBytes("ISO-8859-1"))); out.flush(); out.close(); BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream())); String line=""; for(line=br.readLine();line!=null;line=br.readLine()) { System.out.println(line); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private String readFile() { StringBuilder sb=new StringBuilder(); try { BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("E:/raw.xml"))); //这里的raw.file内容就是 上面那个xml片段,就是读取内容,将请求的xml保存成字符串 进行post发送 String line=""; for(line=br.readLine();line!=null;line=br.readLine()) { sb.append(line+"\n"); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); } public static void main(String[] args) { String url="http://localhost:9000/WebService"; new PostTest().testPost(url); } } [/code] 结果一直是 There went something wrong with parsing the POST data: Premature end of file. 这是什么原因 [b]问题补充:[/b] 好像发现问题了: 我在webservice中有这个代码,是用来截取请求的字段的: [code="java"] InputStream is=......; DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); fac.setNamespaceAware(true); //BufferedReader br=new BufferedReader(new InputStreamReader(is)); //FileOutputStream fos=new FileOutputStream("E:/is.xml"); //for(String line=br.readLine();line!=null;line=br.readLine()) { // fos.write((line+"\n").getBytes()); //} //fos.close(); //br.close(); // parse the InputStream to create a Document doc = fac.newDocumentBuilder().parse(is); [/code] 后来我把中间那个网文件写入的代码注释后 就没问题了 是不是一个InputStream只能用一次啊? 如果我想实现如上功能,就是先写入到文件中,然后解析,这个InputStream该怎么搞?复制一个? [b]问题补充:[/b] [quote]你都已经先写到文件中了,再解析就应该是对文件的内容进行解析了,而不是再去得到原来的InputStream输入流再进行操作 [/quote] 写到文件只是为了测试用的,这么说InputStream写入到文件后,就不能继续用了么? [b]问题补充:[/b] [quote]不是,看错了你的代码, 你只用了一次,程序看来是没什么问题[/quote] 现在问题已经解决了 [code="java"] 1. InputStream is=......; 2. DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); 3. fac.setNamespaceAware(true); 4. //BufferedReader br=new BufferedReader(new InputStreamReader(is)); 5. //FileOutputStream fos=new FileOutputStream("E:/is.xml"); 6. //for(String line=br.readLine();line!=null;line=br.readLine()) { 7. // fos.write((line+"\n").getBytes()); 8. //} 9. //fos.close(); 10. //br.close(); 11. // parse the InputStream to create a Document 12. doc = fac.newDocumentBuilder().parse(is); [/code] 还是这个代码 如果注释部分去掉注释 也就是执行的话 就会出错 如果注释掉就没问题. 我现在的疑问是如果注释代码执行,InputStream就用了2次,是不是因为这个原因,第一次是写入文件,第二次是parse,第二次这个流是不是已经空了,所以异常发生? [quote]web service的调用,我怀疑是不能以out.write(new String(request.getBytes("ISO-8859-1")));把请求内容写进去就当是post [/quote] 我觉得可能不是这个问题 因为con.setDoOutput(true); 就意味着post了
GridPanel分页不成功,读取java后台数据
[code="java"] /**JS文件*/ Ext.onReady(function(){ /***DataGrid界面****/ var fields = ["id","time","source","destination","protocol","info"]; /*var dataUrl;*/ var proxy = new Ext.data.HttpProxy({ url: 'dataPacket.action', method: 'POST' }); var reader = new Ext.data.JsonReader( {totalProperty :'totalProperty',root:'root'}, fields) var store = new Ext.data.Store( { proxy: proxy, reader: reader } ); /* var store = new Ext.data.Store({ autoLoad:true, remoteSort: false, autoDestroy: true, listeners: { render: { fn: function(){ store.load({ params: { start: 0, limit: 5 } }); } } }, proxy:new Ext.data.HttpProxy({url: "dataPacket.action"}), //proxy: new Ext.data.PagingMemoryProxy(), reader:new Ext.data.JsonReader({id:"id",time:"time",source:"source",destination:"destination",protocol:"protocol",info:"info",totalProperty :'totalProperty',root:'root'},fields) });*/ //store.load({params:{start:0,limit:10}}); //var sm = new Ext.grid.CheckboxSelectionModel(); var cm = new Ext.grid.ColumnModel([ { id:"id", header:"NO.", dataIndex:"id", menuDisabled:true },{ header:"Time", dataIndex:"time", menuDisabled:true },{ header:"Source", dataIndex:"source", menuDisabled:true },{ header:"Destination", dataIndex:"destination", menuDisabled:true //renderer:formetSex },{ header:"Protocol", dataIndex:"protocol", menuDisabled:true //sortable:true },{ header:"Info", dataIndex:"info", width:400, menuDisabled:true } ]); var grid = new Ext.grid.GridPanel({ store :store, title:"解码服务的前端原型", region:'center', el:'north-div', margins: '2 2 2 2', width:800, height:300, cm:cm, autoExpandColumn: 'id', loadMask: {msg:'正在加载数据,请稍侯……'}, bbar: new Ext.PagingToolbar({ pageSize: 5, store: store, displayInfo: true, displayMsg: '显示第{0} 条到{1} 条记录,一共{2} 条', emptyMsg: "没有记录" }) }); grid.render(Ext.getBody()); store.load({ params: { start: 0, limit: 5} }); grid.addListener('rowclick', rowClickFn); grid.getSelectionModel().selectFirstRow(); /***添加树界面 ***/ var Tree = Ext.tree; var tree = new Tree.TreePanel({ region:'south', el:'south-div', margins: '2 2 2 2', useArrows:true, autoScroll:true, animate:true, enableDD:false,//是否可以拖动 //enableDrag:true, containerScroll: true, width:800, height:300, rootVisible:false, loader: new Tree.TreeLoader({ dataUrl:'dataDetail.action?number=0' }) }); var root = new Tree.AsyncTreeNode({ text: 'Ext JS', draggable:false, id:'source' }); tree.setRootNode(root); root.expand(); function changeDataDetail(number) { //alert("aa"); tree.loader = new Tree.TreeLoader({ dataUrl:'dataDetail.action?number='+number }); tree.root.reload(); } function rowClickFn(grid, rowIndex, e) { changeDataDetail(rowIndex); //alert('你单击了' + rowIndex); } grid.addListener('rowcontextmenu', rightClickFn);//右键菜单代码关键部分 var rightClick = new Ext.menu.Menu({ id:'rightClickCont', items: [ { //id: 'rMenu1', //handler: rMenu1Fn, text: '右键菜单1' }, { //id: 'rMenu2', //handler: rMenu2Fn, text: '右键菜单2' } ] }); function rightClickFn(grid,rowindex,e){ e.preventDefault(); rightClick.showAt(e.getXY()); } var viewport = new Ext.Viewport({ //region:'north', layout:'border', items:[grid,tree] }); }); [/code] [code="java"] /**后台java代码*/ package com.botwave.action; import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; import com.botwave.actionform.DataActionform; import com.opensymphony.xwork2.ActionSupport; public class DataPacketAction extends ActionSupport{ private String menuString;//Json数据的字符串形式 private List<DataActionform> xmlDataPacket;//存储数据包信息的数组 public String execute() { System.out.println("aaa"); XmlData(); return "success"; } public void XmlData() { xmlDataPacket = new ArrayList<DataActionform>(); //DataPacketDao dataPacket = new DataPacketDao(); DataFactory createFactory = new DataFactory();//实例化工厂对象 xmlDataPacket = createFactory.createDataPacket().selectPacketData();//返回IF_DataPacket接口实例并实现接口方法 //DataActionform demoProperty=new DataActionform();//实例化actionform JSONArray jsonObject = JSONArray.fromObject(xmlDataPacket);//json数据包,通过json返回数据包 try { /**这里的menuString是返回的到js的数据源,totalProperty的值为11*/ menuString = "{totalProperty:" + (xmlDataPacket.size()) + ",root:" + jsonObject.toString()+ "}"; //demoProperty.setMenuString("{totalProperty:" + (a-1) + ",root:" + jsonObject.toString()+ "}"); } catch (Exception e) { menuString = "ss"; //demoProperty.setMenuString("ss"); } //System.out.println( xmlDataTitle.size() ); } public String getMenuString() { return menuString; } public void setMenuString(String menuString) { this.menuString = menuString; } } [/code] 问题:在GridPanel里面显示的时候是全部数据都在第一页显示出来,并没有达到分页的效果,图片如下: [img]http://dl.iteye.com/upload/attachment/284917/43bf3a23-aeb6-3917-bfdd-63c74eb662fb.jpg[/img]
Ext treepanel tabpanel 结合问题
<p>    现在从menu.json文件中读取菜单,点击左侧的树形菜单,右侧该如何动态加载相关模块的信息?  请各位指教 谢谢~</p> <p> </p> <p> </p> <p>    menu.json:</p> <p>  </p> <pre name="code" class="xml">{ "code":"11", "name":"信息维护", "href":"", "iconCls":"information", "parentcode":"" },{ "code":"1101", "name":"机构维护", "href":"agency", "iconCls":"building", "parentcode":"11" },{ "code":"110101", "name":"三级菜单", "parentcode":"1101" }</pre> <p> </p> <p>AccordinTreePanel.js代码</p> <p> </p> <pre name="code" class="js">Ext.ns("QM.ui"); QM.ui.MenuPanel = Ext.extend(Ext.Panel, { /** * @cfg(url) 发送请求的地址 */ /** * @cfg(root) json数组的根字符串 */ constructor: function(config){ QM.ui.MenuPanel.superclass.constructor.call(this, Ext.apply({ maxSize: 240, minSize: 210, // collapseMode: 'mini', collapsible : true, // animCollapse: false, id: 'menuPanel', width: 210, header: true, split: true, layout: 'accordion', layoutConfig : { // 展开折叠是否有动画效果 animate : true }, region: 'west', autoScroll: true, margins:'0 0 0 5', cmargins: '0 0 0 0', ref: 'menuPanel' }, config || {})); }, initComponent: function(){ QM.ui.MenuPanel.superclass.initComponent.call(this); this.addEvents( /** * @event itemclick 树结点被点击时触发 参数:node 当前结点对象,record 当前结点对应record对象 */ 'click', /** * @event afterload 菜单项加载完毕后触发 */ 'afterload'); if (!this.store) { this.store = new Ext.data.JsonStore({ url: this.url, root: this.root, fields: ['code', 'name', 'parentcode', 'iconCls', 'href'] }); } this.store.load({ callback: this.loadTrees, scope: this }); }, loadTrees: function(records, o, s){ var pnodes, trees = [], tree; this.store.sort('code'); for (var i = 0; i &lt; records.length; i++) { var record = records[i]; if (!record.get('parentcode')) { tree = this.creatTreeConfig(record); trees.push(tree); pnodes = []; pnodes.push(tree.root); } else { var next_record = records[i + 1]; var isLeaf = !next_record || next_record.get('parentcode') != record.get('code'); this.addTreeNode(pnodes, record, isLeaf); } } Ext.each(trees, function(tree){ this.add(tree); }, this); this.mon(this.el, 'click', this.onClick, this); this.doLayout(); this.store.destroy(); this.fireEvent('afterload', this); }, //@public 根据结点id找到结点对象 getNodeById: function(id){ var node, trees = this.findByType('treepanel', true); Ext.each(trees, function(tree){ node = tree.getNodeById(id); return !node;//找到的话返回false }); return node; }, onClick: function(e, t, o){ if (Ext.fly(t).hasClass('x-tree-ec-icon')) {//点击伸展按钮时无视 return; } var el, id, node; if (el = e.getTarget('.x-tree-node-el', 3, true)) { e.stopEvent(); id = el.getAttributeNS('ext', 'tree-node-id'); node = this.getNodeById(id); var workPanel = this.ownerCt.workPanel; workPanel.showTab(node); this.fireEvent('click', this, node); } }, creatTreeConfig: function(record){ var config = { xtype: 'treepanel', autoScroll: true, rootVisible: false, // useArrows:true, Vista-style的箭头 lines: true, title: record.get('name'), iconCls: record.get('iconCls'), border:false, root: { nodeType: 'async', expanded: true, id: record.get('code'), children: [] }, listeners: { 'deactivate': function(tree){ tree.getSelectionModel().clearSelections(true); } } }; return config; }, addTreeNode: function(pnodes, record, isLeaf){ var len = pnodes.length; for (var i = len - 1; i &gt;= 0; i--) { if (pnodes[i].id != record.get('parentcode')) { pnodes.pop(); } else { var parent = pnodes[i].children; var node = { text: record.get('name'), id: record.get('code'), iconCls: record.get('iconCls'), href: record.get('href'), leaf: isLeaf }; if (!isLeaf) { node.children = []; pnodes.push(node); } parent.push(node); return; } } }, //@public根据node对象/id显示结点所在tree并选中 selectNode: function(node){ var tree; if (Ext.isString(node)) { node = this.getNodeById(node); } tree = node.getOwnerTree(); this.getLayout().setActiveItem(tree.getId()); tree.expandPath(node.getPath()); tree.getSelectionModel().select(node); } }); //showTab用于显示子组件,loadChild用于子组件的加载 QM.ui.WorkPanel = Ext.extend(Ext.TabPanel, { ref: 'workPanel', region: 'center', resizeTabs: true, minTabWidth: 135, tabWidth: 135, plugins: new Ext.ux.TabCloseMenu(), enableTabScroll: true, activeTab: 0, beforeInit: Ext.emptyFn, loadChild: Ext.emptyFn, initComponent: function(){ QM.ui.WorkPanel.superclass.initComponent.call(this); this.on('tabchange', this.onChange); }, onChange: function(tp, tab){ var menuPanel = this.ownerCt.menuPanel; var tree; if (tab.itemId) { menuPanel.selectNode(tab.itemId); } else //选择主页时清空当前树的选择项 if (tree = menuPanel.getLayout().activeItem) { tree.getSelectionModel().clearSelections(true); } }, //@public根据node或id显示对象panel没有的话创建 showTab: function(node){ var menuPanel = this.ownerCt.menuPanel;//找到菜单面板 if (Ext.isString(node)) { node = menuPanel.getNodeById(node); if (!node) { return; } } var tab, attrs = node.attributes; //只有没有下级的才能显示在右侧 if(attrs.leaf){ if (!this.getItem(attrs.id)) { tab = this.add({ itemId: attrs.id, title: attrs.text, iconCls: attrs.iconCls, closable: true, layout: 'fit' }) var child = this.loadChild(tab, node); tab.add(child || {}); this.doLayout(); } this.setActiveTab(attrs.id); } } })</pre> <p> </p> <p>login.jsp 页面</p> <p> </p> <p> </p> <pre name="code" class="jsp">&lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%&gt; &lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt; &lt;title&gt;web管理登录&lt;/title&gt; &lt;!-- 自定义Css样式 --&gt; &lt;link href="&lt;%=request.getContextPath() %&gt;/mycss/houfei-loading.css" rel="stylesheet" type="text/css" /&gt; &lt;link href="&lt;%=request.getContextPath() %&gt;/mycss/houfei-icon.css" rel="stylesheet" type="text/css" /&gt; &lt;link rel="stylesheet" type="text/css" href="&lt;%=request.getContextPath() %&gt;/css/CssStyle.css"/&gt; &lt;link rel="stylesheet" type="text/css" href="&lt;%=request.getContextPath() %&gt;/css/themes.css"/&gt; &lt;!-- Ext 所需的Js和 Css 文件 --&gt; &lt;link href="&lt;%=request.getContextPath() %&gt;/ext-3.2.1/resources/css/ext-all.css" rel="stylesheet" type="text/css" /&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/ext-3.2.1/ext-base.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/ext-3.2.1/ext-all.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/ext-3.2.1/ext-lang-zh_CN.js" charset="utf-8"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/js/TabCloseMenu.js"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/js/FileUploadField.js"&gt;&lt;/script&gt; &lt;!-- 自定义工具类 --&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/js/GridPanelUtils.js"&gt;&lt;/script&gt; &lt;!-- 主页 --&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/myjs/AccordinTreePanel.js" charset="utf-8"&gt;&lt;/script&gt; &lt;!-- 各分模块 --&gt; &lt;!-- 用户角色 --&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/myjs/userrole/AddUserRoleWindow.js" charset="utf-8"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/myjs/userrole/EditUserRoleWindow.js" charset="utf-8"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/myjs/userrole/UserRoleForm.js.js" charset="utf-8"&gt;&lt;/script&gt; &lt;script type="text/javascript" src="&lt;%=request.getContextPath() %&gt;/myjs/userrole/UserRoleGridPanel.js" charset="utf-8"&gt;&lt;/script&gt; &lt;!-- 主程序 --&gt; &lt;script type="text/javascript"&gt; Ext.ns('App'); //菜单面板 App.MenuPanel = QM.ui.MenuPanel.extend({ root: 'menus', ref: 'menuPanel', url: '/sdcdmp_czfs/myjs/menu.json', title:'导航菜单', iconCls:'houfei-icon-plugin', // tbar:[{}], listeners: { 'click': Ext.emptyFn } }); //工作区面板 App.WorkPanel = QM.ui.WorkPanel.extend({ constructor: function(config){ config = config || {}; Ext.applyIf(config, { items: [{ title: '首页', iconCls:'houfei-homeTabIcon', html: '工作平台' }] }) App.WorkPanel.superclass.constructor.call(this, config); }, //tab:子组件 node:树节点 返回待添加组件 loadChild: function(tab, node){ var attrs=node.attributes; // alert("加载子组件:"+tab.itemId+"==="+attrs.id+"href:"+attrs.href); } }); //负责直连工作区 App.afterLoad = function(viewport){ var qstr = window.location.href.split('?')[1]; if (qstr) { var ps = Ext.urlDecode(qstr); var code = ps['code']; viewport.menuPanel.on('afterload', function(){ viewport.workPanel.showTab(code); viewport.doLayout(); }, null, { single: true }); } } Ext.onReady(function(){ Ext.QuickTips.init(); Ext.BLANK_IMAGE_URL = '/sdcdmp_czfs/ext-3.2.1/resources/images/default/tree/s.gif'; // ThemeManager.init('header'); var menupanel = new App.MenuPanel(); var workpanel = new App.WorkPanel(); var view = new Ext.Viewport({ layout: 'border', items: [{ cls: 'docs-header', height: 30, region: 'north', xtype: 'box', el: 'header', border: false }, { region: 'south', xtype: 'box', el: 'bottom' }, menupanel, workpanel] }); App.afterLoad(view); }); &lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="header"&gt; &lt;div class="api-title"&gt; web管理 &lt;/div&gt; &lt;/div&gt; &lt;div id="bottom"&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;</pre> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p>
Ext如何在登陆界面里同时实现动态换肤和记住密码
<p>//大家好,下面这些代码,是一个登陆界面。里面有动态换肤和记住密码两个功能。我测试过当只有其中一个(比如记住密码)功能时,一切正常,可当两个在一起时,就</p> <p>//有问题(比如换肤不彻底。或执行了  "Ext.Msg.alert("信息","去记密码了");"这句,但是测试时,没效果)我想一定是,得到cookie时,没有限得到所有的cookies,</p> <p>//而导致的,网上说用 "Ext.state.Manager.setProvider(new Ext.state.CookieProvider({}));”  可对它,一点也不了解。。。。。。。。。。。<br>Ext.onReady(function(){<br> <br> Ext.QuickTips.init();  //开启表单提示<br> //login combo 设置 Start<br> var login_store = new Ext.data.Store({<br>      proxy: new Ext.data.HttpProxy({url:'../servlet/Login_combo'}),<br>      reader: new Ext.data.ArrayReader({},[<br>         {name:'value'},<br>         {name:'text'}<br>      ])<br>  })<br> //login combo 设置  end<br> //设置 Login combo Start<br>  var login_combo = new Ext.form.ComboBox({<br>      store: login_store,<br>      fieldLabel: '角色',<br>      emptyText: '请选择',<br>      mode: 'remote',<br>      name: 'duty',<br>      triggerAction: 'all',<br>      valueField: 'value',<br>      displayField: 'text',<br>      width: 90,<br>      readOnly: true,<br>      msgTarget: 'side', <br>      allowBlank: false<br>  });<br>  //设置 Login combo end <br>  <br>  //加载Login_store中所有关于角色的数据<br>     login_store.load();<br> <br> //form设置 Start<br>  var myform = new Ext.form.FormPanel({<br>        defaultType: 'textfield',<br>        labelAlign: 'right',<br>        labelWidth: 58,<br>        x: 50,<br>        y: 40,<br>        anchor:'85% 105%', <br>        frame:true,<br>        items: [{<br>            fieldLabel: '用户名',<br>            name: 'username',<br>            id: 'username',<br>            xtype: 'numberfield',<br>            msgTarget: 'side',<br>            allowBlank: false,<br>            allowNegative: false,<br>            allowDecimals: false,<br>            decimalPrecision: 4,<br>            minValue: 0,<br>            maxValue: 150,<br>            listeners: {<br>              'blur': function() {<br>               showPassword()<br>              }<br>            }<br>        },{<br>            fieldLabel: '密码',<br>            name: 'password',<br>            msgTarget: 'side',<br>            allowBlank: false,<br>            vtype: 'alphanum'<br>        },{<br>         xtype: 'panel',<br>         layout: 'form',<br>         labelWidth: 58,<br>         items:[login_combo,{<br>           layout: 'column',<br>           items: [{<br>            columnWidth: .5,<br>             xtype: 'checkbox',<br>             name: 'remember',<br>             id: 'remember',<br>             inputValue: 'remember',//真正有用<br>             boxLabel: '记住密码'        <br>           },{<br>            columnWidth: .5,<br>             xtype: 'checkbox',<br>             name: 'autoLogin',<br>             inputValue: 'autoLogin',<br>             boxLabel: '自动登录'<br>           }]<br>         }]<br>        }]<br>    });<br>    //form设置 end<br> <br><span style="color: #993300;">    //记住密码功能 Start</span> <br>    //1.设置cookie<br>    function setCookie(name,value) {<br>     var date = new Date();<br>     date.setTime(date.getTime() + 2 * 60 * 60);<br>     window.document.cookie = name + "=" + value + ";expire=" + date.toGMTString();<br>    }<br>    //2.监听事件<br>    function remember() { <br>     if(myform.findByType("checkbox")[0].checked==true) {<br>      Ext.Msg.alert("信息","去记密码了");<br>      setCookie(Ext.get("username").getValue(),Ext.get("password").getValue());<br>     }<br>       <br>    }<br>    //3.得到username字符串长度  Start<br>    function getCookie() {<br>     var username = Ext.get("username").getValue() + "=";  <br>     var username_len = username.length;                   <br><span style="color: #993300;">     var cookie_len = window.document.cookie.length;       //感觉 这里 只有客户端只有一个cookie是才成立?????????????????</span><br>     var i = 0;<br>     while(i&lt;cookie_len) {                                <br>      var j = i + username_len;                         <br>         if(window.document.cookie.substring(i,j)==username) return getCookieValue(j);<br>      i = window.document.cookie.indexOf(" ",j);  <br>      if(i==-1) <br>      return null;<br>     }<br>    }<br>    <br>    //4.读取cookie中的password对应的值<br>    function getCookieValue(offset) {<br>     var password_len = window.document.cookie.indexOf(";",offset);<br>     if(password_len==-1)                                          <br>     password_len = window.document.cookie.length;<br>     return window.document.cookie.substring(offset,password_len);<br>    }<br>    //5.将cookie中存储的password显示出来<br>    function showPassword() {<br>     var password = getCookie();<br>     if(password!=null) {<br>      window.document.all.password.value=password;<br>     }<br>    }<br>    //记住密码功能 end <br>    <br>    //combox设置 Start<br>    //定义combox中要显示的数据,(二维数组data)<br>    var data = [<br>      ['xtheme-pink.css','粉红色'],<br>      ['xtheme-gray.css','灰色'],<br>      ['','默认']<br>    ];<br>    //定义处理数据的store<br>    var store = new Ext.data.SimpleStore({<br>      fields: ['value','text'],<br>      data: data<br>    });<br>    <br>    var combo = new Ext.form.ComboBox({<br>      fieldLabel: '皮肤',<br>      store: store,<br>      emptyText: '请选择您喜欢的皮肤',<br>      mode: 'local',<br>      triggerAction: 'all',<br>      valueField: 'value',<br>      displayField: 'text'<br>    });<br>    //combox设置 end<br>    <br>  <span style="color: #993300;">  //comboBox 事件(换肤功能) Start</span><br>    combo.on('select',function(comboBox){   <span style="color: #993300;">//执行换肤功能</span><br>       var css_skin = comboBox.getValue();<br>       var date = new Date();<br>       date.setTime(date.getTime() + 30*24*60*60);<br>       window.document.getElementsByTagName("link")[1].href="../scripts/ext/resources/css/" + css_skin;<br>       window.document.cookie = "css=" + css_skin + ";expires=" + date.toGMTString(); <br>    });<br>    //以上换肤功能只能用于当前,关闭浏览器不会保留此皮肤。下面让他保留<br><span style="color: #993300;">    var cookieArr = window.document.cookie.split(";");  //感觉 这里 只有客户端只有一个cookie是才成立??????????????????</span><br>    var css = null;<br>    for(var i=0;i&lt;cookieArr.length;i++) {<br>     var arr = cookieArr[i].split("=");<br>     if(arr[0]=="css") {<br>      css = arr[1];<br>     }<br>    };<br>      window.document.getElementsByTagName("link")[1].href="../scripts/ext/resources/css/" + css;<br>    //comboBox 事件(换肤功能) end<br>    <br>    //存放combo的form Start<br>    var combo_form = new Ext.form.FormPanel({<br>       labelWidth: 90,<br>       labelAlign: 'right',<br>       frame: true,<br>       x: 0,<br>       y: 0,<br>       anchor:'100% 25%',<br>       items:[combo]<br>    }); <br>    //存放combo的form end<br>   var _window = new Ext.Window({<br>    layout: 'absolute',<br>    buttonAlign:'center',<br>    title: '登陆',<br>    modal: true,<br>    closable: false,<br>    resizable: false,<br>    plain: true,<br>    width: 350,<br>    height: 230,<br>    items: [combo_form,myform],<br>    buttons: [{<br>            text: '确定',<br>            handler: function(){<br><span style="color: #993300;">             remember();    //执行记住密码        ?????????????????????????????</span><br>             if(!myform.getForm().isValid()) {<br>              return;<br>             }<br>             <br>             myform.getForm().submit({<br>               method: 'post',<br>               waitMsg: '正在登陆,请稍等。。。。',<br>               url: '../servlet/LoginServlet',<br>               success : function(myform, action) {<br>                      if(action.result.msg=='登陆成功'){<br>                           Ext.Msg.alert("信息",action.result.msg);<br>                            window.location.href = 'Admin_main.jsp';<br>                        }<br>                        else {<br>                         Ext.Msg.alelt("信息",action.result.msg);<br>                        }<br>                   },<br>                failure: function(myform,action) {<br>                Ext.Msg.alert("信息",action.result.msg);<br>                }<br>             })<br>              }   <br>        },{<br>           text: '取消',<br>           handler:function(){<br>             myform.getForm().reset();<br>           }<br>        }]<br>   })<br>   _window.show();<br>});</p>
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
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...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的Tencent Kona JDK,分布式HTAP数据库 TBase,企业级容器平台TKEStack,以及高性能图计算框架Plato。短短一周之内,腾讯开源了五大重点项目。其中,TubeMQ是腾讯大数据平台部门应用的核心组件,...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问