Servlet 基本了解
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
Servlet简介
- servlet是sun公司开发的一款用来实现动态web的技术
- 这个动态web技术提供了一个接口:Servelt
- 想要使用,只需要编写一个类去实现这个接口即可
Servelt的使用
Maven父子工程
- 父亲导入的jar包子项目也可以使用
- 子项目无法使用父项目
Maven环境优化
1、pom.xml中添加依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!--作用域 <scope>provided</scope>-->
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
2、修改 web.xml 为最新版
<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_3_1.xsd"
version="3.1"
metadata-complete="true">
</web-app>
3、maven结构搭建完整
- main
- java
- resources
- webapp
directory(目录)
resources(资源)
第一个Servlet程序(Hello Servlet )
步骤 1、
-
创建一个空的maven工程
-
创建javaclass文件
-
继承HttpServlet类
-
重写doGet和doPost方法
public class HelloServlet extends HttpServlet {
//由于get和post方法只是请求实现的方式不同,所以可以相互调用,业务逻辑是一样的
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.println("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
步骤 2、
编写web.xml文件中注册Servelt 和 Servlet请求路径
<servlet>
<!--servlet名称-->
<servlet-name>hello</servlet-name>
<!--servlet地址-->
<servlet-class>com.ben.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--请求的servlet名称-->
<servlet-name>hello</servlet-name>
<!--访问路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
ErrorServlet
修改404报错界面
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");//使用html格式显示
resp.setCharacterEncoding("UTF-8");//使用UTF-8编码
PrintWriter writer = resp.getWriter();
writer.println("<h1>错误</h1>");
}
Servlet 的使用
ServletContext
1、能够实现数据的共享
在不同的servlet中想要实现数据的交互就需要使用context,context是作用与项目所有servlet之上的
存储数据 setAttribute(“数据名称”,数据内容)
读取数据 getAttribue(“数据名称”,数据内容)
例、
在一个servlet中保存数据到context中,再在另一个servlet中获取数据后使用并显示
SetServlet
public class SetContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getServletContext() 获取当前的上下文
ServletContext context = this.getServletContext();
String name = "张三";
//将数据存储到context中
context.setAttribute("username",name);
}
}
GetServlet
public class GetContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//从context中获取数据
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("名字:"+ username);
}
}
2、能够获取初始化参数
获取xml文件的初始化参数
方法名:getInitParameter()
编写xml文件中需要获取的初始化参数
<!--初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
Servlet 中使用context获取
使用的是context中的getInitParameter方法
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//init (初始化) parameter(参数)
String url = context.getInitParameter("url");
System.out.println("url" + url);
resp.getWriter().println(url);
}
}
3、能够请求转发
地址不会改变的去获取其他页面数据
方法名: getResponseDispatcher()
方法名:getResponseDispatcher(“访问地址”).forward(req,resp)
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取当前上下文
ServletContext context = this.getServletContext();
// RequestDispatcher requestDispatcher = context.getRequestDispatcher("/sul");
// requestDispatcher.forward(req,resp);
context.getRequestDispatcher("/url").forward(req,resp);
}
}
4、能够获取资源文件中的资源
方法名: getResourceAsStream(“资源路径”)
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//使用Properties读取资源文件数据
Properties prop = new Properties();
prop.load(is);
String name = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().println("name:"+name);
resp.getWriter().println("password:"+pwd);
}
}
HttpServletResponse
1、简单分类
负责向浏览器发送数据分方法
//平常流
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);
2、下载文件
获取下载文件的路径和需要下载的文件名称
让浏览器支持下载
设置下载文件的输入流
创建缓冲区
将输入流写到缓冲区中再下载到客户端
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取下载文件地址
String realPath = "C:\\Users\\86132\\IdeaProjects\\javeweb-servlet\\response\\src\\main\\resources\\1.png";
System.out.println("下载文件的路径为:"+realPath);
//2 获取下载文件的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\" + 1));
//3 设置浏览器支持下载该文件
resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
//4 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
//5 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6 获取 OutputStream 对象
ServletOutputStream out = resp.getOutputStream();
//7 将输入流写入到缓冲区,再用OutputStream输出到客户端
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
3、重定向
重定向是能够改变路径的访问页面
resp.sendRedirect(“访问路径”)
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求
//从请求中获取参数
ServletContext context = this.getServletContext();
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username=" + username);
System.out.println("password=" + password);
//重定向
resp.sendRedirect("/r/success.jsp");
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>
<%--设置提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
HttpServletRequest
- HttpServletRequest 代表了客户端(用户)的请求
- 用户使用Http访问服务器,Http中的所有信息都会被封装在HttpServletRequest中
- 服务器就可以使用本类中的方法接收获取用户的信息(请求)
1、获取前端传递的参数
需要jsp文件与servlet建立联系
获取单个参数 req.getParameter(“参数名”)
获取多个参数 req.getParamaterValues(“表单名”)
登录界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录界面</title>
</head>
<body>
<h1>登录</h1>
<div STYLE="text-align: center">
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:<br>
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="c++">c++
<input type="checkbox" name="hobby" value="python">python
<br>
<input type="submit">
</form>
</div>
</body>
</html>
servlet文件
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用req.getParameter("参数名")获取前端的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbies));
req.getRequestDispatcher("/success.jsp").forward(req,resp);
resp.setCharacterEncoding("UTF-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2、请求转发
请求转发 req.getRequestDispatcher()
重定向 resp.sendRedirect()
Cookie 和 Session
1、理解
客户端在访问网页某个网站的过程代表了一次会话(Session)
那么如何使服务服务器知道该用户访问过(常见应用:网站会保存用户的登录信息下次自动登录)
- 使用Cookie标记该用户,服务器识别访问过的用户只需要识别标记即可
- 服务器保存访问用户的信息从而下次相同用户访问时候识别
2、应用
cookie
-
从客户端请求中得到cookie信息
Cookie[] cookies = req.getCookies();
-
服务器响应给客户端新的cookie
resp.addCookie();
Session
Session中的数据是存与服务器中的,标识一个Session的方法是id,每一个Session都有一个唯一的id,id会在用户访问时候给用户的客户端进行储存
等到客户再次访问服务器的时候Session会通过查询客户端主机的SessionId来匹配服务器中该用户的数据
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//获取Session对象
HttpSession session = req.getSession();
Person person = new Person("小张");
//在session中存入数据
session.setAttribute("name",person);
resp.getWriter().write(session.getId());
}
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//获取Session中数据
HttpSession session = req.getSession();
Person person = (Person) session.getAttribute("name");
resp.getWriter().write(person.toString());
}
<!--设置session有效时间为15分钟-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>