1、 HelloServlet
-
构建一个普通的Maven项目,删掉src目录,然后建立module,这个空的工程就是Maven的主程序
-
关于Maven父子工程的理解
父项目中会有:
<modules> <module>servlet-01</module> </modules>
子项目中会有:(我用的IDEA2021版没有)
<parent> <groupId>nuc.ss</groupId> <artifactId>Javaweb-02-HelloServlet</artifactId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java,子项目可以直接使用。
-
Maven环境搭建
- 将web.xml换为最新的版本
- 建立java,resources
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LE7Kp2i1-1643017657499)(JavaWeb.assets/image-20220123123619499.png)]
-
编写代码
package nuc.ss.HelloServlet; 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; public class HelloServlet extends HttpServlet { //由于get和pos只是请求实现的不同的方式,可以相互调用,业务逻辑都一样 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter write = resp.getWriter();//响应流 write.print("Hello Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
编写映射
为什么? 我们写的是java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>nuc.ss.HelloServlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
配置Tomcat
-
启动测试
访问路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAUdKQLd-1643017657500)(JavaWeb.assets/image-20220123130709908.png)]
2、servlet原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zuAavWh6-1643017657501)(JavaWeb.assets/eys05n54.xrl.jpg)]
一道面试题:请说出Servlet的生命周期
Servlet对象是用户第一次访问时创建,对象创建之后就驻留在内存里面了,响应后续的请求。Servlet对象一旦被创建,init()方法就会被执行,客户端的每次请求导致service()方法被执行,Servlet对象被摧毁时(Web服务器停止后或者Web应用从服务器里删除时),destory()方法就会被执行。
3、Mapping问题
-
一个servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个servlet可以指定多个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
-
默认请求路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
可以自定义后缀实现请求映射
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.wky</url-pattern> </servlet-mapping>
4、ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
1、共享数据
在这个servlet中储存的数据,可以在另外一个servlet中拿到
储存数据
public class hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();//servlet上下文
String username = "wky";
context.setAttribute("name",username);//将一个数据数据保存在ServletContext中,名字为:name 值为:username
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
取出数据
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String name = (String) context.getAttribute("name");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字:"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!--注册Servlet-->
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>nuc.ss.servlet.GetServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>nuc.ss.servlet.hello</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
测试取出数据:先打开…hello页面,在进行取出数据操作,…getc;如果没有先进行储存,打开getc后会显示值为null!
2、获得初始化参数
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybaits</param-value>
</context-param>
package nuc.ss.servlet;
import javax.servlet.ServletContext;
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 ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3、请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/gp").forward(req,resp);
}
4、读取资源文件
public class PropertiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>db</servlet-name>
<servlet-class>nuc.ss.servlet.PropertiesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>db</servlet-name>
<url-pattern>/db</url-pattern>
</servlet-mapping>