I'm trying to send JSON data to my RESTful web service. Configuration is working fine for a simple GET type. Only the issue is for POST type.
My Angular code
var app = angular.module('myApp', []);
app.controller('MyController', function($scope,$http) {
$scope.pushDataToServer = function() {
$http({
method: 'POST',
url: 'rest/Board/autoSave',
headers: {'Content-Type': 'application/json'},
data:'{"firstName":"Syed", "lastName":"Chennai"}',
}).success(function (data){
$scope.status=data;
}).error(function(data, status, headers, config) {
alert("error");
});
};
});
My Java code
#Path("/Board")
public class BoardAutoSaveService {
#POST
#Path("/autoSave")
#Consumes({MediaType.APPLICATION_JSON})
#Produces({MediaType.TEXT_PLAIN})
public String autoSave(Message msg) throws Exception{
System.out.println("Calling Autosave.");
System.out.println("First Name = "+msg.getFirstName());
System.out.println("Last Name = "+msg.getLastName());
return null;
}
}
Message class
package com.intu;
import java.util.Date;
public class Message {
private String firstName;
private String lastName;
private int age;
private Date date;
private String text;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>iNTU-1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.dao</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Am I missing anything?
The error is
SEVERE: A message body reader for Java class com.intu.Message, and Java type class com.intu.Message, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
application/json ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
You only have the default Jersey JSON providers, which require #XmlRootElement on your model class. You can see the available providers, one of which is the JSON**RootElement**Provider
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
This provider is used to (de)serialize classes annotated with #XmlRootElement.
If you have the following dependency
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey.version}</version>
</dependency>
then it should also pull in the Jackson provider, which doesn't require #XmlRootElement, but you still need to configure Jersey to use Jackson instead of its default provider. To configure it you need to add this to your web.xml Jersey servlet configuration, as seen here
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Or if you are not using a web.xml, add the following inside your ResourceConfig subclass constructor
public class AppConfig extends PackagesResourceConfig{
public AppConfig() {
getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
}
}
Related
I am trying to build a simple Restful api which returns user details.
I have refered this link.
Following are my classes:
API Service class:
package com.demoapp;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.omg.Messaging.SyncScopeHelper;
#Path("/AddUserApi")
public class AddUserApi {
#GET
#Path("/users")
#Produces(MediaType.APPLICATION_XML)
public List<User> getUsers(){
return UserUtil.getUserList();
}
}
Dao Class:
package com.demoapp;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
String name="";
String u_name="";
String password="";
String email="";
String user_type="";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getU_name() {
return u_name;
}
public void setU_name(String u_name) {
this.u_name = u_name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUser_type() {
return user_type;
}
public void setUser_type(String user_type) {
this.user_type = user_type;
}
}
Utils class:
package com.demoapp;
import java.util.List;
public class UserUtil {
public static String mysql_ip="jdbc:mysql://10.119.32.86/";
public static String metadata_database="haas";
public static String mysql_username="root";
public static String mysql_password="";
public static List<User> getUserList(){
List<User> users=new ArrayList<User>();
User user=new User();
user.setName("abc");
user.setU_name("ab_c");
user.setPassword("1234");
user.setUser_type("normal");
user.setEmail("abc#gmail.com");
users.add(user);
return users;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>UserAPI</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.demoapp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey RESTful Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
I have downloaded the jersey jar from the site and extracted 3 folders and added those jars in build path.
I have done everything according to the tutorial.
Still its showing this error:
Could you please suggest a way of solving this issue?
Provided the server is up and running and the application is deployed without errors, your endpoint should be available in the following URL:
http://[host]:[port]/[context]/rest/AddUserApi/users
Where:
[context] is the name of your WAR file (without the .war extension).
/rest comes from the web.xml: <url-pattern>/rest/*</url-pattern>.
/AddUserApi comes from the #Path annotation on the AddUserApi class.
/users comes from #Path annotation on the getUsers() method.
Your URL should be: localhost:8082/UserAPI/rest/AddUserApi/users
I'm getting this error: MessageBodyWriter not found for media type=application/json, type=class SalesService.Item, genericType=class SalesService.Item.
What I want to do is let my restful service method return a custom object, in this case object: Item. But im getting this error and in the browser error 500.
Im using JAX-RS version 2.25.1 libraries in netbeans
I know there are allot of questions like this but i could not find any solution that worked exactly for me.
Thanks in advance!
WEB.XML
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>examples.rest.school</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>SalesService</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Resources Service class:
package SalesService;
import java.util.ArrayList;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import DB.DBConnecter;
import javax.ws.rs.PathParam;
import java.util.List;
import javax.ws.rs.Consumes;
#Path("Sales")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_JSON)
public class SalesResources {
private final DBConnecter dbConnector;
public SalesResources() {
dbConnector = new DBConnecter();
}
#GET
#Path("session/{sessionID}")
#Produces(MediaType.APPLICATION_JSON)
public Item GetItem(#PathParam("sessionID") String sessionID) {
List<Item> items = new ArrayList<>();
if(dbConnector.CheckSessionID(sessionID)){
items = dbConnector.GetItems();
return items.get(0);
}
return new Item();
}
}
Item class:
package SalesService;
import javax.xml.bind.annotation.XmlRootElement;
#XmlRootElement
public class Item {
private int id;
private String name;
private int quantity;
private double price;
private String type;
public Item(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void AddQuantity() {
this.quantity = quantity + 1;
}
public void RemoveQuantity() {
this.quantity = quantity - 1;
}
public Item(int id, String name, int quantity, double price, String type) {
this.id = id;
this.name = name;
this.quantity = quantity;
this.price = price;
this.type = type;
}
}
StackTrace
04-Mar-2017 21:03:06.273 SEVERE [http-nio-8080-exec-1] org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=application/json, type=class SalesService.Item, genericType=class SalesService.Item.
This was resolved adding
org.codehaus.jackson.jaxrs
In web.xml like this
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>examples.rest.school</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>SalesService,org.codehaus.jackson.jaxrs</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
After adding 4 jackson .JAR files which are these
And also adding them in libraries folder (reference)
Hello all i have sample restful service below with jersey 2
MODEL Class
#XmlRootElement(name = "book")
#XmlType(propOrder = { "id", "name", "author", "price" })
public class Book {
private String id;
private String name;
private String price;
private String author;
public Book() {
}
public Book(String id, String name, String price, String author) {
super();
this.id = id;
this.name = name;
this.price = price;
this.author = author;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
My DAOImpl
public class BooksImpl{
static Connection conn = null;
static Statement stmt;
ResultSet rs;
public List<Book> getAllBooks() throws SQLException, ClassNotFoundException, FileNotFoundException {
getConnection();
List<Book> arrBook = new ArrayList<Book>();
rs = stmt.executeQuery(GET_ALL_BOOKS);
while (rs.next()) {
arrBook.add(new Book(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)));
}
rs.close();
stmt.close();
conn.close();
return arrBook;
}
Service
#Path("/library")
#Produces({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" })
#Consumes({ MediaType.APPLICATION_JSON + ";charset=UTF-8",MediaType.APPLICATION_XML + ";charset=utf-8" })
public class BookServiceImpl implements BookService {
private BooksImpl booksImpl = new BooksImpl();
#GET
public Response getBooks(#QueryParam("format") String format) throws SQLException, ClassNotFoundException, FileNotFoundException {
return Response.status(Status.OK).entity(new GenericEntity<List<Book>>(booksImpl.getAllBooks()) {
}).header(HttpHeaders.CONTENT_TYPE, "XML".equalsIgnoreCase(format)
? MediaType.APPLICATION_XML + ";charset=UTF-8" : MediaType.APPLICATION_JSON + ";charset=UTF-8")
.status(Status.OK).build();
}
So finally i make a get request say in a postman like ::
http://localhost:8080/BooksJAXRS/library
It's good and i can get the reponse by getting all the books from DB.
my web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>BooksJAXRS</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.library.books</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
My requriment is for different http methods we have different url end point paths for example
GET : http://localhost:8080/BooksJAXRS/library
POST : http://localhost:8080/BooksJAXRS/library
DELETE : http://localhost:8080/BooksJAXRS/library/1
PUT : http://localhost:8080/BooksJAXRS/library/1
So i make a props file
GET=http://localhost:8080/BooksJAXRS/library
POST=http://localhost:8080/BooksJAXRS/library
DELETE= http://localhost:8080/BooksJAXRS/library/1
PUT= http://localhost:8080/BooksJAXRS/library/1
Now i want to capture that restful url and pass it through props file and route it accordingly depending on the method and url
Thank you
Mark
You could create 2 mappings on 2 different methods that call the same private method like this:
#Path("/")
...
public class BookServiceImpl implements BookService {
#Path("/")
#GET
public Response getBooksByRoot(#QueryParam("format") String format) {
return getBooks(format);
}
#Path("/library")
#GET
public Response getBooksByLibrary(#QueryParam("format") String format) {
return getBooks(format);
}
private Response getBooks(String format) {
...
}
#Path("/library")
#POST
public Response createBook(#QueryParam("name") String name) {
...
}
Response Update:
It seems that you want a dynamic mapping, so you need to use a Path with a regular expression.
#Path("/")
...
public class BookServiceImpl implements BookService {
#Path("/{parameter:.*}")
#GET
public Response getBooks(#PathParam("parameter") String parameter) {
if (properties.getProperty("GET").endsWith(parameter) {
// code to get the books here
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
WARNING: The code snippet above is only meant to show the idea, it is not meant to be perfect. For example testing with endsWith could not be enough according to your context.
When using standard web descriptor (url-pattern /*) and annotated end-points (#Path /library) there is not so much that can be done for dynamic (at runtime) routing at this points. If you want or need some dynamic routes, one option put the "app" into a new context like:
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
And add some standard Servlet to forward to your desired end-points:
<servlet>
<servlet-name>route</servlet-name>
<servlet-class>my.package.Route</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>route</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
my.package.Route will be get hit on any other than /app/* request and you can do your routing to forward the request anywhere.
I`m using java and eclipse to make a simple rest service. I use jersey 1.19 and jackson 1.7.9. But when i try to run project with tomcat i have this exception.
SEVERE: Servlet [jersey-servlet] in web application [/EmployeeService] threw load() exception
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:506)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:488)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Here i will copy the classes and web.xml which i have.
#XmlAccessorType(XmlAccessType.NONE)
#XmlRootElement(name = "employee")
public class Employee {
public String empId;
public String name;
public String email;
#javax.xml.bind.annotation.XmlElement(required = true)
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
#javax.xml.bind.annotation.XmlElement(required = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#javax.xml.bind.annotation.XmlElement(required = true)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
#Path("/emp")
public class EmployeeService {
#GET
#Path("/get/{empId}")
public Employee getEmployee(#PathParam("empId") String empId) {
Employee employee = new Employee();
employee.setEmpId(empId);
employee.setName("Nikola");
employee.setEmpId("nikola#nikola.com");
return employee;
}
#POST
#Path("/create")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_XML)
public Employee createEmployee(Employee employee) {
// create logic goes here
return employee;
}
#PUT
#Path("/update")
#Consumes(MediaType.APPLICATION_JSON)
#Produces(MediaType.APPLICATION_JSON)
public Employee updateEmployee(Employee employee) {
// create logic goes here
employee.setName(employee.getName() + "updated");
return employee;
}
#DELETE
#Path("/delete/{empId}")
public javax.ws.rs.core.Response deleteEmployee(#PathParam("empId") int empId) throws URISyntaxException {
return javax.ws.rs.core.Response.status(200).entity("Employee with " + empId + "is deleted successfully").build();
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
EmployeeProvider
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.rest.employee</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
I had same issue. I put all jar into referenced libraries. but you have to Just copy-paste all required jar files into WEB-INF/lib folder. Problem solved.
We get this error because of build path issue.You should add "Server Runtime" libraries in Build Path.
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"
Please follow below steps to resolve class not found exception.
Right click on project --> Build Path --> Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
and yeah, remove load on startup tag.
It should work fine.
you should remove this on your web.xml
<load-on-startup>1</load-on-startup>
I understand that you have added the jersey-servlet-1.19.jar but is it in your build path?
When trying to reach "hostname:8080/WebTest1/users" I get this error below:
HTTP Status 404 -
type Status report
message
description The requested resource is not available.
Apache Tomcat/7.0.42
My web.xml looks thusly:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>WebTest1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- Added these for the freemarker templates to work with the servlet -->
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!-- FreemarkerServlet settings: -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html; charset=UTF-8</param-value>
<!-- Forces UTF-8 output encoding! -->
</init-param>
<!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value>
<!-- 0 is for development only! Use higher value otherwise. -->
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<!-- <param-value>ISO-8859-1</param-value> -->
<param-value>UTF-8</param-value>
<!-- The encoding of the template files. -->
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello_servlet</servlet-name>
<servlet-class>com.fivetech.freemarker.examples.HelloServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>user_servlet</servlet-name>
<servlet-class>com.fivetech.webtest1.servlets.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello_servlet</servlet-name>
<url-pattern>/hello-ftl</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>user_servlet</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
<!--
Prevent the visiting of MVC Views from outside the servlet container.
RequestDispatcher.forward/include should and will still work. Removing
this may open security holes!
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>FreeMarker MVC Views</web-resource-name>
<url-pattern>*.ftl</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- Nobody is allowed to visit these -->
</auth-constraint>
</security-constraint>
My bean User.java looks like:
package com.fivetech.webtest1.models;
public class User {
public String firstname;
public String lastname;
public String username;
public String password;
public User(String firstname, String lastname, String username, String password) {
this.firstname = firstname;
this.lastname = lastname;
this.username = username;
this.password = password;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstname() {
return this.firstname;
}
public String getLastname() {
return this.lastname;
}
public String getUsername() {
return this.username;
}
public String getPassword() {
return this.password;
}
}
The Servlet class (UserServlet.java) looks like:
package com.fivetech.webtest1.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
#Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/users.ftl").forward(request, response);
}
#Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//nothing here yet
}
}
I have a 404 from this but I'm sure I am missing something small but I haven't been able to figure it out yet. Any ideas?