周记(四)

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  周末

        

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值