Servlet
用于开发动态web的技术。
是一个接口,定义了Java被浏览器访问到的规则。
步骤:
编写类,实现Servlet接口
把已完成的java类部署至web服务器
Servlet接口
有两个实现类 HttpServlet GenericServlet
通常需要重写doPost、doGet
eg:
1.构建Maven项目。
2.prom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rz</groupId>
<artifactId>java-web</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>servlet-01</module>
</modules>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>
3.创建web子工程
4.web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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">
</web-app>
5.创建Servlet实现类
public class ServletDemo extends HttpServlet {
//可以相互调用,业务逻辑一致
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter(); //相应流
writer.print("Hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
6.编写Servlet的映射
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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-name>hello</servlet-name>
<servlet-class>com.rz.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
7.配置Tomcat
8.开启测试
访问/hello
Servlet原理
由Web服务器调用。
浏览器 - 发生请求 - web容器 1.产生Servlet
2.产生请求 Request
2.产生响应 Reponse
3.调用Servlet的 void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
3.请求体拿到请求后会把响应交给Response
4.web容器读取响应信息
5.响应给客户端
【可重写Servlet实现类,使请求、响应方法改变】
ServletContext
它会为每个Web程序创建ServletContext对象,使它代表当前的web应用
有利于 数据共享、相互调用
1.数据共享
发送内容的servlet
public class ServletDemo extends HttpServlet {
//可以相互调用,业务逻辑一致
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "Tom";
context.setAttribute("name",username); //将数据保存在getServletContext中
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
获取内容的servlet
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);
}
}
相对应的web-xml
<?xml version="1.0" encoding="UTF-8" ?>
<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-name>hello</servlet-name>
<servlet-class>com.rz.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.rz.servlet.getServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
</web-app>
测试过程:
先访问 /hello -> /get 成功显示 “Tom”
2.获取初始化参数
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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">
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.rz.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
class
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
System.out.println(url);//jdbc:mysql://localhost:3306/mybatis
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
3.请求转发
context.getRequestDispatcher("url:").forward(res,resp);
[路径不变化、但内容可以是请求到的内容]
( A -> B -> C)
4.请求资源文件[new Properties()]
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 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);
常见应用
1.向浏览器输出数据
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2.下载文件
获取下载文件路径
下载文件的名字
设置浏览器支持所下载的数据
获取下载文件的输入流
创建缓冲区
获取OutputStream对象
将FileOutputStream流写入buffer缓冲区
使用OutputStram将缓冲区的数据输出到客户端
class
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.
String realPath = this.getServletContext().getRealPath("/FilePath-要下载的文件路径");
//2
String fileName = realPath.substring(realPath.lastIndexOf("\\" + 1));
//3
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
//4
FileInputStream inputStream = new FileInputStream(realPath);
//5
int len = 0;
byte[] bytes = new byte[1024];
//6.
ServletOutputStream outputStream = resp.getOutputStream();
//7.
while ((len = inputStream.read(bytes))>0){
outputStream.write(bytes,0,len);
}
inputStream.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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-name>reps</servlet-name>
<servlet-class>com.rz.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>reps</servlet-name>
<url-pattern>/reps</url-pattern>
</servlet-mapping>
</web-app>
3.重定向
web资源收到客户端请求,通知那个web资源,该过程为重定向
sendRedirect
则在浏览器中输入要访问的 rediect,则网页会自动跳转为 想访问的页面
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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-name>rediect</servlet-name>
<servlet-class>com.rz.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rediect</servlet-name>
<url-pattern>/rediect</url-pattern>
</servlet-mapping>
</web-app>
class
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/web-path");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
原理:
resp.setHeader("Location","/web-path");
resp.setStatus(302);
重定向和转发的区别
共同点
页面都会调整
不同点
请求转发时,url不会变化
重定向时,url会产生变化
HttpServletRequest
用于负责请求的作用,当用户浏览服务器时,会通过HTTP协议访问服务器,则HTTP会把所有的信息都封装到HttpServletRequest中。
获取前端的参数
+String getParameter(String var1):String
+String[] getParameterValues(String var1):String[]
请求转发
getRequestDispatcher("/Path").forward(req,resp)//其中 "/" 代表当前Web应用