
JavaWeb基础(一)
2020-12-25 / highPhone啊
JavaWeb是什么
用Java技术来解决相关web互联网领域的技术栈统称为JavaWeb。
一个web应用程序由多部分组成,主要分为静态web资源和动态web资源:
- html页面 、css(层叠样式表)、 js
- servlet、jsp(JavaServer Page, 本质是servlet)
- java程序
- jar包依赖
- 配置文件
请求和响应
在B/S模式下,浏览器与服务器通过http进行通信,如下是web应用中浏览器与服务器交互的简要过程
Servlet
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
在JavaWeb中,我们通过实现javax.Servlet接口来处理http请求,并返回http响应,如下Servlet接口源码中只约定了5个方法,主要逻辑在service方法里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package javax.servlet;
import java.io.IOException;
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}Servlet的实现类GenericServlet也没有实现service方法:
1
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
我们常用HttpServlet这个类来处理http请求,HttpServlet就继承了GenericServlet,并实现了service方法,其中根据请求方法的不同,分别调用了不同的处理方法,比较常见的就是对应GET请求的doGet()和POST请求的doPost(),并在doGet()或者doPost()方法中处理请求,并封装响应信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38protected 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 = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
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);
}
}
一个简单的Servlet例子
- 编写一个简单的Java类,继承HttpServlet类,并重写其中的doGet()和doPost():
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);//无论是get还是post请求,都调用doPost处理
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter(); //初始化参数
ServletConfig config = this.getServletConfig();//servlet配置
ServletContext servletContext = this.getServletContext();//servlet上下文
resp.setContentType("text/html"); //设置响应的内容
resp.setCharacterEncoding("utf-8");//设置响应编码格式
PrintWriter writer = resp.getWriter();//输出内容到响应信息
writer.print("<h1>highPhone啊</h1>");
}
} - 在web.xml中注册此Servlet并定义此Servlet处理的请求url格式:
1
2
3
4
5
6
7
8<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>xyz.highphone.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.highphone</url-pattern>
</servlet-mapping>
- servlet-name中的名字是唯一确定的,不能重复
- 一个servlet可以对应多个servlet-mapping
- *是url通配符,表明此Servlet会处理url为.highphone结尾的所有请求,也可以精确为/highphone,优先匹配精确url,再匹配通配符
- 启动项目,进行测试

本文链接:https://highphone.xyz/e303343.html