2015/11/16 星期一 中雨
今天开始设计任务管理模块了,由于任务管理模块为了记录数据的方便,设计出的任务管理表不没有严格的遵循数据表设计的三范式,有部分字段出现了数据冗余。这就造成了我查询的时候比较麻烦了,为了满足数据要求查了下sql语句,做个小记录吧。
sql语句如下:
select projectname,count(projectId),count(case when taskstate=0 or taskstate=1 or taskstate=2 then 'taskstate' end) from task group by projectId; |
其中:case when ‘逻辑部分’ then ‘表达式1’else ‘表达式2’ end 语句为sql中的条件控制表达式 翻译为:如果‘逻辑部分’为true,则为‘表达式1’,否则为‘表达式2’ group by projectId:对projectId分组查询 |
上述语句实现了,对任务表中的projectId进行分组统计,结果为:工程名,每组工程的记录条数,每组工程中任务状态为 0或1或2的记录条数。
2015/11/17 星期二 阴 寒冷
今天就昨天测试通过的查询语句做了修改,项目中需要对分组得到的工程进行分类。这就需要对查询语句加条件了,这里的条件是查询统计出的结果再做比较用到了having。
sql语句如下:
select projectid,min(taskstarttime),max(taskfinishtime),count(case when taskstate=0 or taskstate=1 or taskstate=2 then 'taskstate' end) from task group by projectname having count(case when taskstate=5 then 'taskstate' end)=0; |
其中: 1.having后面的count()是查询统计出的结果,该条件的判断是对查询出的结果再做筛选 2.min()和max()是比较取得最小值和最大值,这里是比较得出每组中taskstarttime的最小值和taskfinishtime的最大值 |
在hibernate框架中,用上述sql语句查询,如下:
String sql = " select projectid,min(taskstarttime),max(taskfinishtime),count(case when taskstate=0 or taskstate=1 or taskstate=2 then 'taskstate' end) from task group by projectname having count(case when taskstate=5 then 'taskstate' end)=0"; Query q = session.createSQLQuery(sql); list<Object[]> list =q.list(); |
说明: 1.获得的list<Object[]> list其中的Object[]为查询的结果集数组,存放的值依次为select语句中的查询值 2.获得的count()的值,在hibernate中被封装成了BIgInteger对象,不能强转成Integer对象,可以通过intValue()方法获得Integer型数值 |
补充: 1.上述得到的Query q对象在查询前,还可以通过 q.setFirstResult(num1); q.setMaxResults(num2); 来设置分页查询参数(num1和num2为具体数值),实现分页查询 |
2015/11/18 星期三 阴转小雨
今天就昨天的任务管理添加了一个日志查看的功能,需要将日志文件的信息展示在浏览器上,这里的日志信息是.log的文件,为文本文件。需要展示文件类容,直接链接或者嵌到网页中就行,例如:
<div> <iframe width="100%" frameborder="false" src="test.log" ></iframe> </div> |
其中test.log为项目根目录下的日志文件,而实际项目需要展示的日志文件可能不一定会在项目路径下。这里遇到的日志文件在服务器的其他目录下,这里给链接地址是访问不到日志文件的,需要通过链接来访问服务器中其他目录下的文件,就需要为tomcat配置虚拟路径。
配置步骤:
1.在tomact下找到%Tomcat_Home%/conf/server.xml文件
2.打开上述的server.xml文件,找到<Host></Host>标签,在<Host>标签下添加如下标签
<Context docBase="/usr/local/test/log" reloadable="true" debug="0" path="/logPath"/> |
其中docBase为服务器的虚拟路径,path为映射路径,如果上述log文件下有test.log文件,加上如上配置后则访问链接为: logPath/test.log
3.保存server.xml重新启动tomcat,则虚拟路径配置生效
2015/11/19 星期四 雨
今天做的日志功能需要调用另外一个项目的webservice接口,来查询日志所在目录以及数量等信息。关于webservice接口之前是有接触和使用过,关于webservice的一些基础使用可以查看我之前的记录:http://blog.csdn.net/cb2474600377/article/category/2930055 ,这里记录下关于接口中传递多个简单参数的写法。
这里多个参数是通过路径接参数的,需要配置,示例代码如下:
@POST @Path("/test/{name}/{type}") @Consumes( MediaType.APPLICATION_JSON+";charset=UTF-8") @Produces(MediaType.APPLICATION_JSON) public Response test(@PathParam("name") String userName, @PathParam("type") int type){ String u = userName +" test web service "+type; ResponseBuilder builder = Response.ok(); builder.header("Access-Control-Allow-Origin", "*"); builder.header("Access-Control-Allow-Headers", "*"); builder.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); return builder.entity(u).build(); }
@OPTIONS @Path("/test") public Response testOption() { System.out.println("option"); return Response .ok() .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS") .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With").build(); } |
说明:1.其中@PathParam("name")为接口参数String userName映射的别名为name,在@Path中用{}加到接口路径后面,在调用接口时,对应参数放在路径的对应位置 2.其中 builder.header("Access-Control-Allow-Origin", "*"); builder.header("Access-Control-Allow-Headers", "*"); builder.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 和下面的@OPTIONS注解的方法为配置响应的头信息(在页面用ajax中调用时必须要配置,如果后天java调用接口,可以省略) 3.如果上述@Path()配置中没有添加路径接参(即配置为@Path("/test")),则客户端用路径传参的方式调用的时候,会报404的错误。 |
就上述接口路径传参调用代码如下: |
String userName = "admin123"; int type = 2; String url = "http://192.168.1.78:8080/testDemo/rest"; ClientConfig clientConfig = new ClientConfig(); clientConfig.register(JacksonJsonProvider.class); Client client = ClientBuilder.newClient(clientConfig); WebTarget webTarget = client.target(url).path("testService").path("test"+"/"+userName+"/"+type); Builder builder = webTarget.request(MediaType.APPLICATION_JSON); String test = builder.post(Entity.entity(null, MediaType.APPLICATION_JSON), new GenericType<String>(){}); System.out.println(test); |
说明:1.其中关于webservice客户端的调用可以参考我另一篇博文: http://blog.csdn.net/cb2474600377/article/details/44240191 2.这里对多参数调用不用的在于: client.target(url).path("testService").path("test"+"/"+userName+"/"+type),将参数连接到path中,这里参数连接的顺序需要参考接口配置中的定义顺序。 |
2015/11/20 星期五 阴
今天遇到这样的一个问题,在我的HTML中有一个<iframe>标签,嵌入一个url,该url是一个日志文件的路径,但该路径文件有可能访问不到,这就会出现url访问不到的错误(404),但这里不能让该<iframe>出现404或者跳转到项目中配置的404页面,而需要访问到指定日志文件,这里就需要对该url进行检测了,查了些资料,没找到方法可以用事件或者js来捕获<iframe>出现404错误的方法,我就用ajax访问url的方式手动写了个山寨的检测方法。
示例代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="<%=basePath%>js/jquery-1.10.2.js" ></script> <title>test</title> <script type="text/javascript"> function load(){ var url = "${logPath}"; if(checkURL(url)){ $("#fileIframe").prop("src",url); }else{ $("#fileIframe").prop("src","taskLog/errorURL.txt"); } }
function checkURL(url){ var flag = false; $.ajax({ url:url, timeout : 3000000, //超时时间设置,单位毫秒 success:function(data){ flag = true; }, async: false, error:function(XMLHttpRequest, textStatus, errorThrown){ flag = false; } }); return flag; } </script> </head> <body οnlοad="load()"> <div> <iframe width="100%" frameborder="false" src="taskLog/readLog.txt" id="fileIframe" name="right" ></iframe> </div> </body> </html> |
说明: 1.这里为了写ajax方便,引入了jquery,当然也可以用原生态的ajax 2.该示例是个简化的页面和ajax调用,关于这个ajax调用具体参数配置根据具体情况而定,可以对ajax的错误处理里面可以做分类 3.JavaScript中的load函数只是个示例,其中的url可以为后台传递来的数据,load函数可以根据具体情况写。 4.如果要运行该代码需要注意: a.jquery框架js文件是否加载到该文件 b.load函数中的url自行编写 c.checkURL函数中的ajax参数需要根据需要配置 d.<iframe>标签中默认的src需要根据实际情况修改 |
2015/11/21---2015/11/22 周末