环境:
尝试使用Servlet 3.0执行FileCounter,我在URL
上收到此错误的http://本地主机:8080 / wtp.filecounter /
不一定是 http:// localhost:8080 / wtp.filecounter / FileCounter ?
Estado HTTP 404 -
输入 Informe de estado
mensaje
descripción El recurso requerido()noestádisponible。
Apache Tomcat / 7.0.26
结构
wtp.filecounter
dao
FileDao.java
servlets
FileCounter.java
FileDao.java 读取并更新文件的访问者
package wtp.filecounter.dao;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class FileDao {
public int getCount() {
int count = 0;
// Load the file with the counter
FileReader fileReader = null;
BufferedReader bufferedReader = null;
PrintWriter writer = null ;
try {
File f = new File("FileCounter.initial");
if (!f.exists()) {
f.createNewFile();
writer = new PrintWriter(new FileWriter(f));
writer.println(0);
}
if (writer !=null){
writer.close();
}
fileReader = new FileReader(f);
bufferedReader = new BufferedReader(fileReader);
String initial = bufferedReader.readLine();
count = Integer.parseInt(initial);
} catch (Exception ex) {
if (writer !=null){
writer.close();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return count;
}
public void save(int count) throws Exception {
FileWriter fileWriter = null;
PrintWriter printWriter = null;
fileWriter = new FileWriter("FileCounter.initial");
printWriter = new PrintWriter(fileWriter);
printWriter.println(count);
// Make sure to close the file
if (printWriter != null) {
printWriter.close();
}
}
}
FileCounter.java 用于读取计数器并以纯文本格式写入的servlet
package wtp.filecounter.servlets;
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;
import javax.servlet.http.HttpSession;
import wtp.filecounter.dao.FileDao;
/**
* Servlet implementation class FileCounter
*/
@WebServlet("/FileCounter")
public class FileCounter extends HttpServlet {
private static final long serialVersionUID = 1L;
int count;
private FileDao dao;
public void init() throws ServletException {
dao = new FileDao();
try {
count = dao.getCount();
} catch (Exception e) {
getServletContext().log("An exception occurred in FileCounter", e);
throw new ServletException("An exception occurred in FileCounter"
+ e.getMessage());
}
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// Set a cookie for the user, so that the counter does not increate
// everytime the user press refresh
HttpSession session = request.getSession(true);
// Set the session valid for 5 secs
session.setMaxInactiveInterval(5);
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
if (session.isNew()) {
count++;
}
out.println("This site has been accessed " + count + " times.");
}
public void destroy() {
super.destroy();
try {
dao.save(count);
} catch (Exception e) {
e.printStackTrace();
}
}
}
的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" 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" version="3.0">
<display-name>wtp.filecounter</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>
</web-app>
对于什么是错的任何想法?
当我在服务器上运行时,项目打开''http:// localhost:8080 / wtp.filecounter /''而不是''http:// localhost:8080 / wtp .filecounter / FileCounter'',第二个URL工作
答案 0 :(得分:0)
您的servlet映射到/FileCounter
(这是@WebServlet("/FileCounter")
注释的作用)。它是webapp的一部分,部署在某个上下文路径下(假设上下文路径为/myFirstWebApp
)。因此,调用servlet的URL是:
http://localhost:8080/myFirstWebApp/FileCounter
答案 1 :(得分:0)
您的应用程序的名称是wtp.filecounter
,并且您有一个带有映射"/FileCounder"
的servlet。这就是为什么如果你击中
在浏览器中"http://localhost:8080/wtp.filecounter/FileCounter"
调用了带有映射doGet
的servlet的"/FileCounter"
方法,您就会得到响应。
答案 2 :(得分:0)
'http:// localhost:8080 / wtp.filecounter / FileCounter'的工作原理是因为在那里找到了servlet。
“wtp.filecounter”部分是您的应用程序上下文。如果要使用“http:// localhost:8080 / wtp.filecounter /”访问servlet,则需要将欢迎文件更改为指向 FileCounter servlet,而不是使用这些默认的欢迎文件
答案 3 :(得分:0)
只需在web.xml中添加 FileCounter 作为'welcome-file'之一
答案 4 :(得分:0)
您所指的教程使用的是动态Web模块版本2.5,而您可能正在使用3.0。 仔细看看你的web.xml,你会发现那里没有创建servlet映射。如果您不使用eclipse的默认servlet创建工具,可能会发生这种情况。这是我的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>com.vogella.web.filecounter</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>FileCounter</servlet-name>
<servlet-class>com.vogella.web.filecounter.servlet.FileCounter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileCounter</servlet-name>
<url-pattern>/FileCounter</url-pattern>
</servlet-mapping>
</web-app>