入门案例见前面引入
实现登录
要实现效果:
代码:
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<!--
action就是表单数据提交路径:
相对路径:相对路径,路径不以"/"开头,会把路径拼接到当前路径的后面
目标路径:http://localhost:8080/login
当前路径:http://localhost:8080/login.html
-->
<form action="login" method="post">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
LoginServlet:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取客户端提交的请求参数:客户端携带过来的请求参数都在request对象中
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.校验客户端提交的用户名和密码是否正确
if ("tom".equals(username) && "123456".equals(password)){
//登录成功
//将校验结果响应给客户端
response.getWriter().write("login success!!!");
}else {
//登录失败
//将校验结果响应给客户端
response.getWriter().write("login failed!!!");
}
}
}
统计网站被访问的总次数
需求:
在页面中显示您是第x位访问的用户.
代码:
CountServlet
@WebServlet("/count")
public class CountServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取容器中计数器原本的次数
ServletContext servletContext = getServletContext();
Object count = servletContext.getAttribute("count");
//判断servletContext中是否有计数器
if (count == null) {
//说明是第一次访问
//就往servletContext中添加一个计数器
servletContext.setAttribute("count", 1);
} else {
//说明不是第一次访问,那么我们就要对原来的计数器+1,再存进去
int number = ((int) count) + 1;
servletContext.setAttribute("count",number);
}
//2.向客户端响应
response.getWriter().write("Welcome!!!");
}
}
ShowServlet
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从容器里面获取计数器
ServletContext servletContext = getServletContext();
int count = (int) servletContext.getAttribute("count");
//将count响应给客户端
response.getWriter().write("access count is:" + count);
}
}
ServletContext
作为域对象存取值
package com.gavin.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String aaa = "hello";
//将aaa存储到ServletContext对象中
//1.调用getServletContext()方法获取ServletContext对象
ServletContext servletContext = getServletContext();
//2.调用servletContext对象的setAttribute(String name, Object object)
servletContext.setAttribute("aaa",aaa);
}
}
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用getServletContext()方法获取ServletContext对象
ServletContext servletContext = getServletContext();
//2.调用servletContext对象的getAttribute(String name)
String aaa = (String) servletContext.getAttribute("aaa");
System.out.println("在ServletDemo2中获取aaa的值为:"+aaa);
}
}
获得文件mime-type
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext对象
//2.调用getMimeType(String file)方法
String file1 = "a.mp3";
String file2 = "b.png";
String mimeType1 = getServletContext().getMimeType(file1);
String mimeType2 = getServletContext().getMimeType(file2);
System.out.println("ServletDemo3..."+mimeType1+" , "+mimeType2);
}
}
获得全局初始化参数
<!--全局的初始化参数,通过ServletContext来获得的,也就意味着任何Servlet都可以获得-->
<context-param>
<param-name>akey</param-name>
<param-value>aaa</param-value>
</context-param>
//2.获得全局初始化参数
String value = getServletContext().getInitParameter("akey");
System.out.println("value="+value);
获取web资源路径
/*
目标:使用字节输入流,读取timg.jpg图片
方法1:FileInputStream
方法2:ClassLoader
方法3:ServletContext
*/
@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//方法1:FileInputStream
// InputStream is = new FileInputStream("D:\\工作\\公司培训_长训4班\\03_javaweb\\day08\\day08\\day08_03_servletContext\\web\\img\\timg.jpg");
//方法2:ClassLoader将文件转换成流
// InputStream is= ServletDemo5.class.getClassLoader().getResourceAsStream("../../timg.jpg");
//方法3:ServletContext可以获取web里面的资源的真实路径
ServletContext servletContext = getServletContext();
// String realPath = servletContext.getRealPath("img/timg.jpg");
InputStream is = servletContext.getResourceAsStream("img/timg.jpg");
System.out.println(is);
}
}
request
请求转发
@WebServlet("/demo5")
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用请求转发跳转到index1.html页面
//相对路径:不以/开头的路径写法,是以目标资源相对当前资源的路径
//绝对路径:以/开头的路径写法,对于请求转发而言在完整url的基础上省去“项目路径”,对于非请求转发而言在完整url的基础上省略“服务器路径”
//完整url:http://localhost:8080/项目名/资源名
request.getRequestDispatcher("/index1.html").forward(request,response);
}
}
request做域对象取值
package com.gavin.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo6")
public class ServletDemo6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
request域对象的作用范围只在一次请求之间
所以request作为域对象存取值必须和请求转发一起使用
*/
String str = "张三";
//将str存入域对象
request.setAttribute("str",str);
//跳转到ServletDemo7
request.getRequestDispatcher("demo7").forward(request,response);
}
}
@WebServlet("/demo7")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将str取出域对象
String str = (String) request.getAttribute("str");
System.out.println(str);
}
}
response
定时刷新
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服务器告诉浏览器5s后跳转到百度
response.setHeader("Refresh","5;url=https://www.baidu.com");
}
}
重定向
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向跳转:让浏览器进行页面
//设置响应状态码
/*response.setStatus(302);
//跳转百度首页
response.setHeader("Location","https://www.baidu.com");*/
//设置重定向的简单方式
// response.sendRedirect("https://www.baidu.com");
// response.sendRedirect("WEB-INF/index1.html"); 404
//请求转发跳转到WEB-INF中的index1.html
request.getRequestDispatcher("WEB-INF/index1.html").forward(request,response);
}
}
完成文件下载
需求
• 创建文件下载的列表的页面,点击列表中的某些链接,下载文件.
分析
1)什么是文件下载
将服务器上已经存在的文件,输出到客户端浏览器.
说白了就是把服务器端的文件拷贝一份到客户端,文件的拷贝—>流(输入流和输出流)的拷贝
2)文件下载的方式
• 第一种:超链接方式(不推荐)
链接的方式:直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载, 如果浏览器支持这个格式(eg: png, jpg…)的文件,那么直接打开,不再下载了
• 第二种:手动编码方式(推荐)
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会下载.
思路分析
1)超链接方式
- 准备下载的资源(文件)
- 编写一个下载页面
- 在这个页面和是哪个定义超链接,指定href
2)编码方式
手动编码方式要求:设置两个头和一个流
设置两个头:
Content-Disposition:服务器告诉浏览器去下载
设置一个流:
获得要下载文件的输入流
编码
- 获得文件名fileName
- 设置两头一流
a) 一流,根据文件名获得文件输入流
b) 一头,告诉浏览器文件的MIME类型
c) 一头,告诉浏览器去下载 - 通过response获得输出流(字节流)
- 流的操作
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载页面</title>
</head>
<body>
<h1>超链接方式直接下载</h1>
<a href="file/banner_1.jpeg">下载banner_1.jpeg</a><br>
<a href="file/banner_1.rar">下载banner_1.rar</a><br>
<h1>自定义Servlet进行下载</h1>
<a href="download?fileName=banner_1.jpeg">下载banner_1.jpeg</a><br>
<a href="download?fileName=banner_1.rar">下载banner_1.rar</a><br>
<a href="download?fileName=1.jpeg">下载1.jpeg</a><br>
</body>
</html>
servlet
@WebServlet("/download")
public class ServletDownload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取客户端想要下载的文件名
String fileName = request.getParameter("fileName");
//2.设置下载的文件的mime-type
String mimeType = getServletContext().getMimeType(fileName);
response.setHeader("Context-Type",mimeType);
//3.使用字节输入流,读取客户端要下载的是那个文件
InputStream is = getServletContext().getResourceAsStream("file/" + fileName);
//4.使用字节输出流,将图片输出到浏览器
ServletOutputStream os = response.getOutputStream();
//输出之前,我们通过设置响应的方式,指示客户端下载文件
//我们先将fileName进行URL编码
String encodeFileName = URLEncoder.encode(fileName, "UTF-8");
// 设置相应类型 application/octet-stream
response.setContentType("application/x-msdownload");
response.setHeader("Context-Disposition","attachment;filename="+encodeFileName);
IOUtils.copy(is,os);
os.close();
is.close();
}
}
综合案例注册登录(使用数据库)
注册
需求
登录
需求
• 点击登录按钮, 进行登录.
• 登录成功,显示login Success
• 登录失败,显示login failed