发表于: 2019-04-09 21:57:37

2 573


继续处理昨天的bug

今天为了减少干扰,我重写了一个简单版的json-taglib

这是我构建的项目结构,只有几个必须的模快controller、model、资源文件以及web页面jsp。

model模块的Test是实体类,定义了我们要写的一些数据类型及名称。

package com.jnshu.model;

public class Test {

   private long id;
   private String name;
   private Integer age;
   private String address;

   public Test(long id,String name,Integer age,String address){
       this.id=id;
       this.name=name;
       this.age=age;
       this.address=address;
   }
}

controller代码:

package com.jnshu.controller;

import com.jnshu.model.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;
import java.util.List;

@Controller
public class ControllerTest {
   int code;
   String message;
   @RequestMapping(value = "/Json")//url路径
   //在放回方法上添加ResponseBody可实现对象自动转换json格式
//    @ResponseBody
   public ModelAndView getJsp(){
       code=1;
       message="成功";
       System.out.println("1111111111111111111111111111");
       List<Test> tests = new ArrayList<>();
       Test test1=new Test(1,"小王",25,"武汉");
       tests.add(test1);
       ModelAndView modelAndView = new ModelAndView("Json","tests",tests);
       modelAndView.addObject("code",code);
       modelAndView.addObject("message",message);
       return modelAndView;
   }
}

web.xml是前端控制器DispatcherServlet的承载处

<!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:ServletContext.xml</param-value>
  </context-param>

  <!--前端控制器DispatcherServlet-->
  <servlet>
     <servlet-name>dispatcherServlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ServletContext.xml</param-value>
     </init-param>
     <load-on-startup>0</load-on-startup>
  </servlet>
  <!--控制器的映射器-->
  <servlet-mapping>
     <servlet-name>dispatcherServlet</servlet-name>
     <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

然后是前端控制器的初始化参数配置文件ServletContext.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:mvc="http://www.springframework.org/schema/mvc"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

  <!--自动注册RequestMappingHandlerMappingRequestMappingHandlerAdapter-->
  <mvc:annotation-driven/>

  <!--注解扫描,属性是指定扫描的包-->
  <context:component-scan base-package="com.jnshu.controller">
     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  </context:component-scan>

  <!--视图解析器-->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
     <!--前缀-->
     <property name="prefix" value="/WEB-INF/jsp/"/>
     <!--后缀-->
     <property name="suffix" value=".jsp"/>
  </bean>
</beans>

log4j日志资源文件就不赘述了。最后一个页面文件Json.jsp

<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json" %>
<%--<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>--%>
<%--zhushidiaole
 Created by IntelliJ IDEA.
 User: xu_ha
 Date: 2019/4/2
 Time: 21:53
 To change this template use File | Settings | File Templates.
--%>
<%@page contentType="text/html;charset=utf-8" language="java" %>
<json:object>
   <json:property name="code" value="${code}"/>
   <json:property name="message" value="${message}"/>
   <json:array name="JsonTest" var="item" items="${tests}">
       <json:object>
           <json:property name="id" value="${item.id}"/>
           <json:property name="name" value="${item.name}"/>
           <json:property name="age" value="${item.age}"/>
           <json:property name="address" value="${item.address}"/>
       </json:object>
   </json:array>
</json:object>

正常来讲,这样我们就可以用json生成假数据了,可是我用容器装载程序运行后却却是下图样子:

页面是加载过去了,然而写在controller里的数据却都没有在页面中显示,也就是说jsp文件并没有读取到占位符内字符所代表的字符串。

jsp页面中的json属性value“Cannot resolve property or method”无法解析属性和方法。

jsp页面中的json属性value无法解析属性解决了,原因是之前在model中没有添加get方法,导致jsp的var无法获取字段属性。

同时我把controller中的URL地址做了调整,不再与jsp文件同名,再尝试一下是否能在页面中显示json数据

依然无法将对象中的数据导入到页面中去...到底是哪里处理问题....


终于找到原因所在了......

<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json" %>
<%--<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>--%>
<%--zhushidiaole
 Created by IntelliJ IDEA.
 User: xu_ha
 Date: 2019/4/2
 Time: 21:53
 To change this template use File | Settings | File Templates.
--%>
<%@page contentType="text/html;charset=utf-8" language="java" %>
<%@page isELIgnored="false" %>
<json:object>
   <json:property name="code" value="${code}"/>
   <json:property name="message" value="${message}"/>
   <json:array name="JsonTest" var="item" items="${tests}">
       <json:object>
           <json:property name="id" value="${item.id}"/>
           <json:property name="name" value="${item.name}"/>
           <json:property name="age" value="${item.age}"/>
           <json:property name="address" value="${item.address}"/>
       </json:object>
   </json:array>
</json:object>

将约束添加上去

在postman中的样子

今日完成:直接返回JSP,直接用Json Tag-lib 生成假数据,用Postman测试接口

今日问题:已解决

明日计划:在服务器开发环境部署Resin,用"document-directory"的方式配置好War包


返回列表 返回列表
评论

    分享到