Servlet接口Servlet程序
⭕Servlet是什么?
- 把实现了servlet接口的java程序叫做Servlet
- Servlet是sun公司开发动态web的一门技术
- Sun子这些API中提供了一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个步骤
a. 编写一个类,实现Servlet接口 b.把开发好的java类部署到web服务器中
⭕HelloServlet
Servlet接口有两个默认的实现类:HttpServlet
- 关于Maven父子工程
//当建立子项目时父项目中会添加
<modules>
<module>ServletDemoSon01</module>
</modules>
//子项目会有
<parent>
<artifactId>ServletDemo1.0</artifactId>
<groupId>com.Jack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
- Maen环境优化
- 修改web.xml文件为最新(模板就在tomcat的实例目录中)
- 将maven的结构补充完整(java文件夹和resource文件夹)
- 编写一个Servlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello,Serlvet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
- 编写Servlet的映射(为什么需要映射?)
因为我们写的是Java程序,但是要通过浏览器访问
而浏览器需要连接web服务器
所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径:
<!-- 注册Servlet -->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.jack.servlet.HelloServlet</servlet-class>
</servlet>
<!-- Servlet的请求路径 -->
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
- 配置Tomcat
- 启动测试
⭕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>/Hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello3</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>*.Jack</url-pattern>
</servlet-mapping>
⭕ServletContext
- ServletContext是什么
web容器在启动的时候,他会为每一个web程序创建一个ServletContext对象,它代表了当前的web应用 - ServletContext可以干什么
a. 共享数据 b. 获取web初始参数 c. 请求转发 d.读取资源文件 - 共享数据
⌨这个是放置类,可以传递数据,在这个Servlet中保存数据,可以在另外一个Servlet中拿到
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name="Jack";
servletContext.setAttribute("name",name);//将一个数据保存在ServletContext中,key为name,value为name
System.out.println("Hello");
}
}
⌨接收读取数据
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
Object getname = (String)servletContext.getAttribute("name");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("你好!"+getname);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
⌨完善web.xml文件
<servlet>
<servlet-name>Hello02</servlet-name>
<servlet-class>com.jack.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello02</servlet-name>
<url-pattern>/hello02</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.jack.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
- 获取web初始参数
⌨配置一些web应用初始化参数
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
⌨ servlet类
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.getWriter().print(url);
}
- 请求转发
⌨servlet类
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
System.out.println("进入了ForwardDemo");
//转发的请求路径
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/sd");
//调用forward方法实现请求转发
requestDispatcher.forward(req,resp);
//也可以这样
//servletContext.getRequestDispatcher("/sd").forward(req,resp);
}
- 读取资源文件
⌨Properties
//- 再Java目录下新建properties
//- 在resources目录下新建properties
//发现:都被打包到了同一路径下:classes,我们俗称这个路径为classpath:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().print(username+";"+password);
}
⭕HttpServletResponse & HttpServletRequest
- web服务器接收客户端http请求,针对这个请求分别创建:
代表响应的HttpServletResponse—-给客户端发送响应的信息
代表请求的HttpServletRequest—-用来获取客户端请求过来的参数 - 服务端如何接收请求的?
客户端/浏览器通过HTTP协议访问并向服务器发出请求 , 所有的请求都会被封装进HttpServletRequest中,通过HttpServletRequest的方法,获得客户端的所有信息 - HttpServletResponse方法简单分类
⌨负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
⌨负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setBufferSize(int var1);
void sendError(int var1, String var2) throws IOException;
void sendError(int var1) throws IOException;
void sendRedirect(String var1) throws IOException;
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
void setStatus(int var1);
- 常见应用
a.向浏览器输出信息 b.下载文件 c.验证码 d.实现重定向
小结🚩
※※※※※五星级重要