概述
编写Servlet的方式
- 1.方式一
- 1.1编写Servlet的方式一
- 2.方式二(IDE,继承HttpServlet)
- 2.1编写Servlet的方式二
- 3.方式三
- 3.1编写Servlet的方式三
- 4.方式四(IDEA和tomcat关联的方式)
- 4.1编写Servlet的方式四
- 4.2 IDEA设置部署目录
- 4.3 IDEA设置部署说明
1.方式一
1.1编写Servlet的方式一
如果java文件的代码变更,一般选择第二个即可,但是有时候会失效,这个时候你可以再次选择第三个就ok了,或者说如果你的电脑性能比较好, 那么你可以每次都选择第三个。
FirstServlet.java
public class FirstServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello servlet");
}
}
结果:
2.方式二(IDE,继承HttpServlet)
2.1编写Servlet的方式二
1.如果使用的是get请求去访问当前servlet,那么会进入到doGet方法中
使用的是post请求,那么会进入到doPost方法中
配置:
表单页面位置:
package com.cskaoyan.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 封装、继承、多态
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("doget");
}
//如何让doPost方法执行到?
//doGet, if the servlet supports HTTP GET requests
//doPost, for HTTP POST requests
//你需要使用post请求去访问当前servlet,就会执行该方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("dopost");
}
}
结果:
问题1:既然每个servlet都有service方法,那么为什么继承httpServlet没有service?
因为父类里面有service方法,所以可以继承得到父类的该方法。
HttpServlet已经对service方法做出了实现。
问题2:为什么程序会执行到doGet或者doPost里面呢?
servlet程序的执行入口是什么?
一定要记住,是service方法。
service源代码:
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
问题3:为什么要有doGet和doPost之分呢?
可以做一些更精细的划分。比如当前请求只允许post请求方式进行提交,那么我就可以把逻辑写在doPost里面,doGet不写对应的逻辑。
3.方式三
3.1编写Servlet的方式三
关于映射关系的配置,不仅可以通过web.xml方式,还可以通过注解的方式。
//@WebServlet(name = “thirdServlet”, urlPatterns = “/servlet3”)
//我们还可以进一步简化,因为我们发现其实name属性好像没啥用
//@WebServlet(urlPatterns = “/servlet3”)
//到这一步之后,还可以精简到底,如果括号里面只有一个值,那么默认表示的就是urlPattern
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 java.io.IOException;
//@WebServlet(name = "thirdServlet", urlPatterns = "/servlet3")
//我们还可以进一步简化,因为我们发现其实name属性好像没啥用
//@WebServlet(urlPatterns = "/servlet3")
//到这一步之后,还可以精简到底,如果括号里面只有一个值,那么默认表示的就是urlPattern
@WebServlet("/servlet3")
public class ThirdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
4.方式四(IDEA和tomcat关联的方式)
4.1编写Servlet的方式四
在tomcat的三个可能有部署痕迹的地方都没有找到部署的迹象。
CATALINA_BASE:隐藏配置文件路径所在
可以理解为idea会复制tomcat的配置文件,然后再该目录下重新开启一个新的tomcat实例(记住结论即可,过程不需要掌握)。
4.2 IDEA设置部署目录
4.3 IDEA设置部署说明
- 开发目录和部署目录不是同一个目录,但是也不是毫无关联,因为开发目录里面web目录下的文件会再部署根目录里面出现
- 开发目录里面的java源代码文件,经过编译以后,也会出现再部署根目录的WEB-INF/classes目录下。
- 其中web(带有蓝色小点的目录为一个功能性目录),它做了如下的一个映射,其实是为了方便再部署根目录里面放置静态资源文件。
规则:
凡是再改web目录下出现的文件,最终再部署之前,都会原封不动地复制到部署根目录里面去。也就是说,如果今后你希望再部署根目录里面新建一个1.html,那么你只需要再这个web目录里面设置就可以了,因为再项目部署地时候,它会把1.html给复制到部署根目录里面去。
今后如果问你,如何去查找某个应用的部署根目录,应该如何去查找?artifacts
本质就是开发目录里面地文件会东拼西凑凑在一起,凑到out/artifacts/xxxx目录下,然后将这个目录部署在tomcat里面。
经常出现的一个问题:
比如再开发环境的web目录下有一个1.html,然后通过tomcat部署,访问该1.html发现无法访问
1.确保开发目录里面的web是一个功能性目录。
2.也会出现有时候开发目录里面的文件无法复制到部署根目录的情况。
此时可以先尝试这么做:
1.先重新部署,点击Redeploy
如果不行,那么执行
2.rebuild project,然后再次执行1
如果再实际过程中,此时还是不行,那么可以
3.把部署根目录全部删了,然后再次执行2,再次执行1
最后
以上就是鲤鱼母鸡为你收集整理的编写Servlet的方式1.方式一2.方式二(IDE,继承HttpServlet)3.方式三4.方式四(IDEA和tomcat关联的方式)的全部内容,希望文章能够帮你解决编写Servlet的方式1.方式一2.方式二(IDE,继承HttpServlet)3.方式三4.方式四(IDEA和tomcat关联的方式)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复