0
votes

Hi I am new to Java world and I am trying to make my own web application with Spring MVC. Now, I am going to read a text file in my local directory, for example, the text file like this:

TestData_FileOne.txt
1,100
2,200
3,300
4,400
5,500

The result I would like to present in a browser page like this (in a table) :

1   2   3   4   5
100 200 300 400 500

so I implemented 1) Controller , 2) Model , and 3)View(.jsp file).

**1) My Controller and 2)Model ([Q1] [Q2]) **

@Controller
public class TestController {

   @RequestMapping("/testMVC")
   public String testmvc(Model model){
       String dirString = "C:/Users/Me/Documents/Test/";
       Path testFile;
       List<String> testData;

       testFile = Paths.get( dirString + "TestData_FileOne.txt");

       try {    
           testData = Files.readAllLines(testFile, StandardCharsets.UTF_8);
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
           //return "unable to read...";
           return "unable to read...";
       }

       // ====== changes from here based on Aeseir's answer========
       List<String> dataNum = new ArrayList<String>();
       List<String> data = new ArrayList<String>();
       for(int i=0; i<testData.size()-1;i++){
           dataNum.add(testData.get(i).split(",")[0]);
           data.add(testData.get(i).split(",")[1]);
       }
       model.addAttribute("dataNum", dataNum);
       model.addAttribute("data", data);
       // ======= changes until here ==============

       return "testMVC";   
    }
  }

(Read the text file works fine when I checked System.out.println part)

2) testMVC.jsp file

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>  

<table>
<thread>
  <tr>
    <th>Table with dynamic data from model</th>
  </tr>
</thread>
<tbody>
  <c:forEach var="dataNumValue" items="${dataNum}"> [items added but.. Q5]
    <tr>
      <td>
             ${dataNumValue}
      </td>
    </tr>
  </c:forEach>
  <c:forEach var="dataValue" items="${data}"> [items added but.. Q5]
    <tr>
      <td>
             ${dataValue}       --- [Q2']
     </td>
    </tr>
  </c:forEach>
</tbody>
</table>

So..I know Q1/Q1' should be match, and Q2/Q2' as well.

1) however, I am confused about the object in model.addAttribute("", object); in Q1, Q2? and addAttribute is the right choice among model attributes?

2) Do I need var="dataNum" and var="data" in Q3, Q4 and did I do correctly?

I appreciate any advice if I made mistake.

Extra Question so I have updated Controller code and jsp file like the above after Aeseir's answer (Thanks!!) but I have warning in jsp file after I added items then warning (Q5) and of course, the page is not presented. [Q5]: warning : "items" does not support runtime expressions I searched for the warning, then advices like check the jstl version - should be above version 1.0 - My jstl version is 1.2. so shouldn't be any problem.... Can you check my changes part? and What else could cause this warning except jstl version?.

Solution for extra question 5 @taglib directive should be like this in jsp file:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> => /jsp was missing in the middle

This @taglib correction + code changes the above based on Aeseir's answer works all fine!

1

1 Answers

3
votes

Q1 and Q2

You were almost there. Model will pass most data you put into it. Its up to your rendering page to determine how to display it.

And you will need to change the types to arrays since you want to output multiple strings.

List<String> dataNum = //populate accordingly
List<String> data = // populate accoridngly

model.addAttribute("dataNum", dataNum);
model.addAttribute("data", data);

Q3 and Q4

Yes you do but you need to complete it this way:

<c:forEach var="dataNumValue" items="${dataNum}">   
    <tr>
      <td>
             ${dataNumValue}    
      </td>
    </tr>
  </c:forEach>
  <c:forEach var="dataValue" items=${data}>     
    <tr>
      <td>
             ${dataValue}       
     </td>
    </tr>
  </c:forEach>

Hope that helps