tjholmes66
tjholmes66

Reputation: 1998

Spring 5 controller return html string to load in Browser

The old code that I had was a Java Servlet which took in some parameters and pushed out an HTML string:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // Delegate the action
    doAction(request, response);
}

The 'doAction' method did something like this:

public void doAction(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // Read the template EHR HTML file
    String html = FileUtils.readFileToString(new File(getServletContext().getRealPath("/viewer.html")), "utf-8");
     ... make some changes to html ...
     PrintWriter out = response.getWriter();
    out.println(html);   
}

And this sent an HTML string to the browser and all the relative locations worked. I mean we have a directory structure where we have:

webapp/viewer.html
webapp/js
webapp/css
webapp/img

An this page loads, and all the loaded js and css and img files all worked great. I should say the call to this is like: http://localhost:8080/webapp/servlet?{some parameters)

Now, we are using Spring 5 and I have lots of experience setting up Spring and creating RESTful end-points that spit out JSON. I call a new Spring Controller passing in variables, and the back-end logic all works. Now I want to output HTML the same way the old servlet worked. This is what I have now.

@Controller
public class ViewerController
{
    @GetMapping(value = "/viewer", produces = MediaType.TEXT_HTML_VALUE)
    public @ResponseBody String getPatientViewerData(
@RequestParam(value = "token", required = true) String token, 
@RequestParam(value = "myid", required = true) String myid)
{
    String html = "";
    try {
        html = service.getHtmlFromBusinessLogic();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    return html;
}

When I test this, I DO get HTML returned to my String, but all the relative links are thrown off, so if I my call to this controller is: http://localhost:8080/webapp/api/controller?{some parameters) Then all my relative links are looking for: http://localhost:8080/webapp/api/js/somejs.js or http://localhost:8080/webapp/api/css/somecss.css

The Application Initializer in this Spring 5 webapp is as follows:

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

private static final Log logger = LogFactory.getLog(ApplicationInitializer.class);

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[]
    { ViewerAppConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class[]
    {};
}

    @Override
    protected String[] getServletMappings() {
       return new String[] { "/api/*" };
    }

}

So, I am sure the easiest solution would be to remove the "/api/ for any rest calls here. I was hoping there would be another solution, but I am not sure if there is any.

Any help would be great. Thanks!

Upvotes: 0

Views: 903

Answers (1)

Jose-Rdz
Jose-Rdz

Reputation: 539

you're code looks ok. Maybe the only thing you need to define is how to serve static resources in your Spring config. Something like this:

@Configuration
@EnableWebMvc 
public class MvcConfig implements WebMvcConfigurer { 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**") // your prefered mapping, for example web app root
                .addResourceLocations("/resources/"); // project files location
    }
}

This way you tell Spring where to expose all your css, js, etc... also you don't need to change your DispatcherServlet url mapping.

Upvotes: 1

Related Questions