Tag: servlets

不直接编写Servlet以创建REST API的原因

在我目前的公司中,我们正在开始一个新项目,该项目将是Java中的REST API,部署在像Tomcat这样的servlet容器中。 在我之前使用REST框架(如JAX-RS和Jersey,JBOSS REST Easy,Spring MVC)的经验中,我知道使用类似于直接编写Servlet来处理请求的框架的一些优点。 (当然我们知道所提到的框架仍然使用Servlets) 我发现很难说服他们。 因为他们建议编写servlet,认为它对性能更好(可能是这种情况,但我认为使用其中一个框架的开销对REST API来说应该是微不足道的)。 以下是我的理由: 1) 更少的样板和更简洁的代码 (更易于维护和测试)。 使用JAX-RS框架或SpringMVC,您可以通过编写带有注释的方法来非常轻松地定义REST资源,注释指示资源的PATH,要使用的http方法,查询和url参数,接受的编码等标题等。 例: @GET @Path(“/users”) @Produces({MediaType.APPLICATION_JSON}) public UserList getUsers(@QueryParam(“group”) String group) { return userService.findUsers(group); } 使用servlet,您至少需要这样的东西: 在web.xml中映射每个servlet的url(在Servlet 3.0中不需要): UsersServlet test.UsersServlet UsersServlet /users 然后在servlet类中: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String group = request.getParameter(“group”); response.setContentType(“application/json”); PrintWriter out = response.getWriter(); […]

类“”nether有一个main方法,也没有在web.xml文件中指定的servlet

我正在使用NetBeans 7.1并在其中创建了一个servlet。 现在,当我运行它时,它正在给我 类”既没有main方法也没有web.xml中指定的servlet 在此之后,它再向我显示一个错误: class”没有主方​​法“ 我无法弄清楚问题是什么。 我已经卸载并安装了两次NetBean,但没有任何帮助。 servlet只是一个没有逻辑的普通servlet。

如何将String转换为Json

我有一个Java的servlet,我想知道如何做到以下几点。 我有一个带有名称值的String变量,并希望创建一个Json,其变量类似于{“name”: “David”} 。 我该怎么做呢? 我有以下代码,但我收到一个错误: Serious: Servlet.service () for servlet threw exception servlet.UsuarioServlet java.lang.NullPointerException at servlet.UsuarioServlet.doPost (UsuarioServlet.java: 166): 在线 String myString = new JSONObject().put(“name”, “Hello, World!”).toString();

在Spring Servlet项目的web.xml中加载contextConfigLocation的顺序

假设我有一个Spring Java项目,我正在尝试将其配置为Web服务器servlet。 这是web.xml文件的精简版本: contextConfigLocation /WEB-INF/spring/generalApplicationContext.xml my-servlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/specificApplicationContext.xml 1 my-servlet /foo/* 这里需要注意的关键是我已经指定了两个要加载的XML文件。 一个是我的整个应用程序的通用,而另一个是特定于“my-servlet”servlet。 对于只有一个servlet映射的设置,这没有意义。 但是,我的项目有多个servlet映射,每个都有特定的Spring设置。 我的问题: Spring将首先加载哪个contextConfigLocation? 它是generalApplicationContext.xml还是specialApplicationContext.xml? 更重要的是,装载的顺序是否重要? 从我的调试工作来看,它似乎很明显,因为当我将一些独立的Spring配置从一个文件移动到另一个文件时,我得到了不同的错误。 注意:对于多个servlet映射是否使用多个弹簧配置是一个好的做法是值得商榷的。 使用XML配置而不是新的Java配置也是如此。 但这不是我在这里要问的问题。 让我们试着关注我的主要问题。

使用getServletConfig()时获取NPE .getServletContext()。getAttribute()(Java)

我很长一段时间都在使用Servlets。 而我正在解决这个问题,我无法终止自己。 我正在使用Servlets创建一个小型Web项目,我尝试将我的Service和DAO对象添加到ServletContext。 HTTP Status 500 – Error instantiating servlet class com.taxi.service.controller.LoginController type Exception report message Error instantiating servlet class com.taxi.service.controller.LoginController description The server encountered an internal error that prevented it from fulfilling this request. exception javax.servlet.ServletException: Error instantiating servlet class com.taxi.service.controller.LoginController org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) root cause […]

方法链如何工作?

如何在下面的示例中从getServletContext()调用getRequestDispatcher(“xxx”) ? 这样的调用程序如何工作? 请给我一个关于这个背景的清晰图片。 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(“/index.jsp”); dispatcher.include(request, response);

Java Web应用程序:如何实现缓存技术?

我正在开发一个Java Web应用程序,它通过从Web服务加载的大型XML配置文件来实现它的行为。 由于在访问应用程序的特定部分之前实际上不需要这些文件,因此它们会被懒惰地加载。 当需要其中一个文件时,会向Web服务发送查询以检索相应的文件。 由于某些配置文件可能会被使用得多,比其他配置文件更频繁,我想设置某种缓存(可能有1小时的到期时间),以避免一遍又一遍地请求相同的文件。 对于所有会话中的所有用户,Web服务返回的文件都是相同的。 我不使用JSP,JSF或任何其他花哨的框架,只是普通的servlet。 我的问题是,在Java Web应用程序中实现这样一个全局静态缓存的最佳实践是什么? 单例类是否合适,或者由于J2EE容器会有奇怪的行为吗? 我应该通过JNDI在某处暴露某些东西吗? 我该怎么做才能使我的缓存不会在集群环境中搞砸(每个集群服务器有一个缓存可以,但不是必需的)? 鉴于上面的信息,将一个负责缓存的对象作为ServletContext属性是否是一个正确的实现? 注意:我不想在启动时加载所有这些并完成它,因为那会 1)。 每当我的应用程序启动时,都会重载webservice 2)。 我的应用程序运行时文件可能会更改,所以无论如何我都必须重新查询它们 3)。 我仍然需要一个全局可访问的缓存,所以我的问题仍然存在 更新:使用缓存代理(例如squid)可能是个好主意,但是每个对webservice的请求都会在post Data中发送相当大的XML查询,每次都可能不同。 只有Web应用程序才真正知道对Web服务的两个不同调用实际上是等效的。 谢谢你的帮助

UTF-8使用Tomcat编码servlet表单提交

我试图将一个包含unicode字符的简单表单发布到servlet操作。 在Jetty上,一切都没有障碍。 在Tomcat服务器上,utf-8字符会被破坏。 我得到的最简单的案例: 形成: ` ` 行动: class MyAction extends ActionSupport { public void setData(String data) { // data is already mangled here in Tomcat } } 我在server.xml中的上有URIEncoding =“UTF-8” 动作的第一个filter调用request.setCharacterEncoding(“UTF-8”); 包含表单的页面的内容类型是“text / html; charset = UTF-8” 在表单中添加“accept-charset”没有任何区别 我能使其工作的唯一两种方法是使用Jetty或将其切换为method =“get”。 这两个都导致角色没有问题。

Tomcat不会刷新响应缓冲区

我在下面的Tomcat 7上测试了HttpResponse#flushBuffer和PrintWriter#flush HttpResponse#flushBuffer ,但似乎响应忽略了它们而不是像预期的那样在线上刷新内容。 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(“/HelloServlet”) public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); pw.println(“say hi now”); pw.flush(); response.flushBuffer(); try { Thread.sleep(5000); } […]

如何从HttpClient切换到HttpUrlConnection?

我正在创建一个Android应用程序,我通过HttpClient将数据从Android应用程序发送到servlet。 我使用HttpPost方法。 我在Android开发者网站上看到Apache HttpClient库在Android Froyo 2.2中有一些错误,毕竟使用HttpUrlConnection代替HttpPost是一个好习惯。 所以我想将我的HttpPost代码转换为HttpUrlConnectio,但不知道如何。 我在这里发布我的Android代码以及servlet代码 Android代码 private String postData(String valueIWantToSend[]) { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); try { List nameValuePairs = new ArrayList(); nameValuePairs.add(new BasicNameValuePair(“param1”,valueIWantToSend[0])); nameValuePairs.add(new BasicNameValuePair(“param2”, valueIWantToSend[1])); nameValuePairs.add(new BasicNameValuePair(“param3”, valueIWantToSend[2])); nameValuePairs.add(new BasicNameValuePair(“param4”, valueIWantToSend[3])); nameValuePairs.add(new BasicNameValuePair(“param5”, valueIWantToSend[4])); nameValuePairs.add(new BasicNameValuePair(“param6”, […]