操作方法:
发布方式 | 访问路径 |
---|---|
webapps/创建目录/资源文件 | http://localhost:8080/目录名字/资源文件 |
webapps/ROOT/资源文件 | http://localhost:8080/资源文件 |
注意:因为ROOT默认网站(项目)根目录,访问的时候ROOT目录不写
webapps发布资源的优点:
发布简单,自己将资源放入到webapps目录下
由于简单,这种发布方式是最重要的,以后大家就使用这种方式
webapps发布资源的缺点:
如果发布很多资源目录会造成资源堆积
通过虚拟目录资源发布方式可以将资源发布服务器的外部,解决webapps目录发布资源堆积的问题
修改配置文件server.xml,在host标签里面增加Context标签节点
<Context path="虚拟资源目录" docBase="真实发布资源目录"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/javaee122" docBase="C:/MyFileTest/gqwm"/>
Host>
修改了配置文件需要重新启动Tomcat
浏览器访问路径:http://localhost:8080/虚拟资源目录/资源路径
<Context docBase="项目所在的目录" />
不用重启Tomcat服务器,资源也放在Tomcat的外面
能够接收浏览器发送的请求,然后动态生成一个网页返回给浏览器
package com.itheima.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
/**
创建1个Servlet,继承于HttpServlet抽象类,它已经实现了Servlet接口
*/
public class Demo1Servlet extends HttpServlet {
// 重写doGet或doPost
// request一个请求对象, response是一个响应对象。这两个对象由tomcat创建,我们直接使用即可
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置内容的类型和编码,告诉浏览器这是一个网页,编码是utf-8
response.setContentType("text/html;charset=utf-8");
// 得到打印流,将数据输出给浏览器
PrintWriter out = response.getWriter();
// 把网页打印给浏览器
out.print("我是第1个Servlet,现在时间是:"
+ new Timestamp(System.currentTimeMillis()) + "");
}
}
http://localhost:8080/day24_03_servlet2_5_war_exploded/demo
- 新增了一些注解,简化的javaweb代码开发,可以省略web.xml配置文件
- 支持异步处理:多线程技术
- 支持可插性特性:书写的代码编译后生成的class文件可以直接部署到其他项目自动加载执行,即可实现新功能的扩充
package com.itheima.servlet;
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;
import java.io.PrintWriter;
/**
使用注解开发Servlet
*/
@WebServlet(name = "demo2", urlPatterns = "/demo2")
public class Demo2Servlet extends HttpServlet {
// 重写doGet方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应的类型和编码
response.setContentType("text/html;charset=utf-8");
// 得到打印流
PrintWriter out = response.getWriter();
out.print("我是Servlet3.0创建的
");
}
}
idea工具会自动将新创建的web项目部署到服务器上,不用切换项目部署,直接启动服务器即可,注意部署新项目一定要重启服务器
找到配置servlet的生成模板位置
修改模板内容为
默认模板
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet(name = "${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
}
修改后的模板
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet(name = "${Entity_Name}", urlPatterns= "/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
doGet(request, response);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
}
3. 使用新模板再次生成Servlet看效果
以后开发servlet推荐使用Servlet模板+注解的方式
1.idea部署web资源目录的真实位置
部署到webapps外部了,采用的是什么部署方式呢?独立xml虚拟目录方式
访问资源管理器对应的位置
编辑xml文件
疑问:将虚拟部署资源目录名字设置为“/”,项目部署到哪里去了?如何访问资源?
http://localhost:8080/demo
说明
虚拟部署目录名字“/”,访问的路径中没有虚拟目录名字了,依然采用独立xml虚拟目录部署方式,生成的xml文件为ROOT.xml,这里如果名字为ROOT,访问就不写虚拟目录名字
查看某一个类的体系结构,光标放到类的上面使用Ctrl+Alt+U
浏览器通过url请求服务器,服务器首先会调用servlet的service方法,由于子类重写了service方法会调用子类重写的doGet或doPost方法
实现了Servlet接口,重写很多方法
HttpServlet类继承GenericServlet接口,重写service方法,判断是什么请求类型,如果是get请求走子类的doGet方法,如果是post请求,都子类doPost方法。
疑问:直接继承GenericServlet 类能实现处理请求与响应吗?
可以的
新建类继承GenericServlet
package com.itheima.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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 = "Demo3Servlet", urlPatterns = "/Demo3Servlet")
public class Demo3Servlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello Demo3Servlet");
}
}