Servlet的学习
一、ServletContext的部分应用
1.1 ServletContext的应用举例(共享数据)
- java代码
通过servletContext.setAttribute(“username”, “xxx”);共享数据
package com.seven.servlet01;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("username", "xxx");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
通过String username = (String) servletContext.getAttribute(“username”);拿到共享的数据
package com.seven.servlet01;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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 GetArr extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String username = (String) servletContext.getAttribute("username");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;");
PrintWriter writer = resp.getWriter();
writer.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
- xml代码
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.seven.servlet01.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/set</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getget</servlet-name>
<servlet-class>com.seven.servlet01.GetArr</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getget</servlet-name>
<url-pattern>/getget</url-pattern>
</servlet-mapping>
</web-app>
1.2 拿到初始化的一些数据
- java的代码
package com.seven.servlet01;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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 GetArr extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;");
PrintWriter writer = resp.getWriter();
writer.println(url);
}
- xml的配置
<!-- 初始化的一些数据-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybaits</param-value>
</context-param>
1.3 路由转发(路径不变,返回的是被转发后的内容)
- java代码
转发的java代码
package com.seven.servlet01;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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 GetArr extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
// 请求转发
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/seven");
requestDispatcher.forward(req,resp);
}
}
转发后进行响应的java代码逻辑
package com.seven.servlet01;
import javax.servlet.ServletException;
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 RequestDispatcherLx extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().println("我是被转发后的界面");
}
}
- xml配置
<!-- 请求的界面路由-->
<servlet>
<servlet-name>getget</servlet-name>
<servlet-class>com.seven.servlet01.GetArr</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getget</servlet-name>
<url-pattern>/getget</url-pattern>
</servlet-mapping>
<!-- 配置接收转发的界面-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>com.seven.servlet01.RequestDispatcherLx</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/seven</url-pattern>
</servlet-mapping>
1.4 读取静态资源
- java代码
package com.seven.servlet01;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class GetResources extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
// 存一个输入流
InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
// 加载这个输入流
properties.load(inputStream);
// 获取数据
String username = properties.getProperty("username");
String password = properties.getProperty("password");
// 控制台展示
System.out.println(username+";"+password);
// 界面展示
resp.getWriter().println(username+","+password);
}
}
- xml和静态资源就不展示了,重复的操作。
上面的操作在后续的学习中都会有替代的方法
共享数据可以用session
初始化数据几乎不用
请求转发,可以通过request实现
读取静态文件可以用类加载或者反射
二、response的部分应用
2.1 JavaWeb实现下载文件
- 需要文件的绝对地址以及文件名
- 设置浏览器支持下载文件(需要文件名):
resp.setHeader(“Content-Disposition”, “attachment;filename=” +
URLEncoder.encode(fileName,“UTF-8”));- 设置ContentType类型,自动判断下载文件类型
resp.setContentType(“application/multipart/form-data”);- 获取文件输入流(需要文件绝对地址):
FileInputStream in = new FileInputStream(realPath);- 创建一个缓冲区
int len = 0;
byte[] buffer = new byte[1024];- 获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();- 将文件写入到缓冲区,通过ServletOutputStream 对象输出到客户端
while ((len=in.read(buffer))>0) {
outputStream.write(buffer,0,len);
}- 关闭流数据
in.close();
outputStream.close();
java代码如下:
package com.seven.responseDome01;
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.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class responseDome extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取想要下载文件的路径
String realPath = "F:\\JavaWebServlet\\servletResponse\\target\\classes\\科比.jpg";
System.out.println("文件路径为:"+ realPath);
// 2. 获取下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
System.out.println("文件名为:" + fileName);
// 3. 设置让浏览器能够支持()下载我们需要的东西, 中文文件名需要进行编码(),否则可能会出现乱码。
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
// 设置ContentType类型, 这样可以自动判断下载文件的类型
resp.setContentType("application/multipart/form-data");
// 4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 6. 获取OutputStream对象
ServletOutputStream outputStream = resp.getOutputStream();
// 7. 奖FileOutputStream流写入到buffer缓冲区, 使用OutputStream将缓冲区中的数据输出到客户端!
while ((len=in.read(buffer))>0) {
outputStream.write(buffer,0,len);
}
System.out.println(buffer);
// 8. 关闭流
in.close();
outputStream.close();
resp.getWriter().println("正在下载");
}
}
2.2 JavaWeb实现图形验证码
java代码示例(自行配置xml):
package com.seven.responseDome01;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class imageResponse extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 如何让浏览器3秒刷新一次
resp.setHeader("refresh", "0.2");
// 在内存中创建一个图片
BufferedImage image = new BufferedImage(400,50,BufferedImage.TYPE_INT_RGB);
// 得到图片
Graphics2D g = (Graphics2D) image.getGraphics();
// 设置图片的背景颜色
g.setColor(Color.white);
g.fillRect(0,0,400,50);
// 给图片写数据
g.setColor(Color.darkGray);
g.setFont(new Font(null, Font.BOLD,20));
g.drawString(makeMess(),40,30);
// 告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg;");
// 网站存在缓存,设置不让浏览器缓存
resp.setDateHeader("expires", -1);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
// 把图片写给浏览器
boolean write = ImageIO.write(image, "jpg", resp.getOutputStream());
}
// 随机生成返回的字符串
private String makeMess() {
Random random = new Random();
String [] messages = {"美丽", "端庄", "善良", "大方", "可爱", "漂亮", "乖巧", "十全十美", "憨不拉几的"};
return "用一个词形容xxx:" + messages[random.nextInt(9)];
}
}
示例:
2.3 JavaWeb实现重定向
jsp代码:
开头带上 : <%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
避免中文乱码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<form action="/login" method="get">
用户名: <input type="text" name="username">
密码: <input type="text" name="password">
<input type="submit">
</form>
</body>
</html>
java代码:
重定向的代码: resp.sendRedirect("/success.jsp");
package com.seven.responseDome01;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 处理请求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
if(username.equals("123")&&password.equals("123")) {
resp.sendRedirect("/success.jsp");
}else {
resp.sendRedirect("/err.jsp");
}
}
}
三、request的部分应用
3.1 获取前端传送的参数
- java代码
获取一个元素:req.getParameter(“username”);
获取一个数组元素: req.getParameterValues(“hobbys”);
请求转发:req.getRequestDispatcher("/success.jsp").forward(req, resp);
package com.jzq.servletRequest;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class ServletRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求和响应的类型utf-8
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 获取账号密码
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
// 获取爱好
String[] hobbys = req.getParameterValues("hobbys");
System.out.println(Arrays.toString(hobbys));
// 请求转发
req.getRequestDispatcher("/success.jsp").forward(req, resp);
}
}
- jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div>
<form action="/login" method="post">
用户名: <input type="text" name="username">
密码: <input type="password" name="password">
爱好:
<input type="checkbox" name="hobbys" value="篮球"> 篮球
<input type="checkbox" name="hobbys" value="足球"> 足球
<input type="checkbox" name="hobbys" value="乒乓球"> 乒乓球
<input type="checkbox" name="hobbys" value="羽毛球"> 羽毛球
<input type="submit">
</form>
</div>
</body>
</html>