Servlet简介
- Servlet是sun公司开发动态web的一门技术
- Sun公司在这些API中提供一个接口叫Servlet 如果你想开发一个Servlet程序只需要连个小步骤
- 编写一个类实现Servlet接口
- 把开发好的java类部署到web服务器中
HelloServlet
Servlet接口在Sun公司有两个默认的实现类 HttpServlet,GenericServlet
构建一个普通的Maven项目 删除src目录 以后的学习在这个项目里建立Model
这个空的工程就是Maven主工程
关于父子工程的理解
父项目中会有一个
<modules>
<module>servlet-01</module>
</modules>
子项目中会有一个
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的jar包子项目可以使用
Maven环境优化
修改web.xml为最新的
将Maven的结构搭建完整
编写一个Servlet程序
编写一个普通类
实现SerVlet接口 继承HttpServlet
package com.deng.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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和post只是请求实现的不同方式 可以互相调用 业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter(); //响应流
//ServletOutputStream outputStream = response.getOutputStream();
writer.println("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
编写Servlet的映射
- 为什么需要映射
- 写的是java代码 但是需要通过服务器访问 而浏览器需要连接web服务器 所以需要 在web服务中注册servlet 还需要给他一个浏览器能够访问的路径
Servlet原理
Servlet是由web服务器调用 web服务器在收到浏览器请求之后,会
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>/hello1 </url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2 </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>*.deng </url-pattern>
</servlet-mapping>
优先级问题
ServletContexct(实现数据共享)
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext 对象,它代表了当前的web应用
共享数据
我在这个SerVlet中保存的数据 可以在另外一个servlet中拿到 ```java //在这个Servlet中为ServletContext添加数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置默认编码格式 resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); ServletContext context = this.getServletContext(); String name = “deng”; //数据 context.setAttribute(“username”,name); //将一个数据以键值对的形式保存在ServletContext中
} //在这个Servlet中从ServletContext获取数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); Object username = context.getAttribute(“username”); resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); resp.getWriter().println(username); }
```java
<!--配置XML-->
<servlet>
<servlet-name>set</servlet-name>
<servlet-class>com.deng.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
<servlet-name>set</servlet-name>
<url-pattern>/setname</url-pattern>
</servlet-mapping>
<!--配置XML-->
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.deng.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/getname</url-pattern>
</servlet-mapping>
获取初始化参数
<!--web.xml-->
<!--以键值对的方式-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306</param-value>
</context-param>
获取初始化参数
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//获取初始化参数
String url = servletContext.getInitParameter("url");
resp.getWriter().println(url);
}
请求转发
<servlet>
<servlet-name>Demo4</servlet-name>
<servlet-class>com.deng.servlet.ServletDem04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo4</servlet-name>
<url-pattern>/demo4</url-pattern>
</servlet-mapping>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//转发的请求路径
RequestDispatcher dispatcher = context.getRequestDispatcher("/get");
dispatcher.forward(req,resp); //调用forward实现请求转发
//context.getRequestDispatcher("/get").forward();
}
读取资源文件
properties类
- 在java目录下新建properties
- 在resources目录下新建properties
发现:都被打包到了同一个路径下,classes(类路径)、
//db.properties
Driver=driver
url=jdbc:mysql://localhost:3306/mybaties
username=tom
password = 123321
<servlet>
<servlet-name>prop</servlet-name>
<servlet-class>com.deng.servlet.PropertiesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>prop</servlet-name>
<url-pattern>/prop</url-pattern>
</servlet-mapping>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//将文件转为输入流(相对位置)
InputStream stream = context.getResourceAsStream("WEB-INF/classes/db.properties");
//new一个Properties对象并读入数据
Properties properties = new Properties();
properties.load(stream);
//获取数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
resp.getWriter().println(username+" "+password);
}