servlet1
servlet 使用笔记
maven依赖
<dependencies>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
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/database</param-value>
</context-param>
<!--配置servlet映射-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.anyi.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
servlet实现类
构建servlet实现类,实现:输出文本到html
public class HelloServlet extends HttpServlet { // 继承HttpServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
resp.setContentType("text/html"); // 设置内容类型为html
resp.setCharacterEncoding("utf-8"); // 设置字符编码为utf-8
resp.getWriter().print("我是html页面上的一句话。"); //输出文本到html
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
doGet(req, resp); //可以使用 get 的处理方式
}
}
servletcontext
1. servlet之间数据交互
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
// 获取servlet上下文对象 servletcontext
ServletContext context = this.getServletContext();
// 1.存储数据
String username = "张三";
context.setAttribute("username", username);
// 2.获取数据,可以不在此servlet获取
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
// 输出信息看
System.out.println("用户名 = " + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
doGet(req, resp);
}
}
2. 获取初始化参数
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
ServletContext context = this.getServletContext();
// 获取web.xml的初始context参数
String url = context.getInitParameter("url"); //获取参数名为url的数据
// 输出信息看
System.out.println("url = " + url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
doGet(req, resp);
}
}
3. 请求转发307
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
// 请求转发
// RequestDispatcher requestDispatcher
// = context.getRequestDispatcher("geturl");
// requestDispatcher.forward(req,resp);
context.getRequestDispatcher("/geturl").forward(req,resp);
//请求转发到/geturl,此为web.xml中配置的url-pattern,(这里没有配置/geturl路径,假设它已存在)
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4. 读取配置文件
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过context获取资源输入流,此处是从web路径为相对路径读取
InputStream is = this.getServletContext()
.getResourceAsStream("/WEB-INF/classes/db.properties");
// 读取properties文件
Properties prop = new Properties();
prop.load(is);
// 获取信息,展示
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().println("username: " + username);
resp.getWriter().println("password: " + password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
image-20240513235445200.png
HttpServletResponse
1. 获取输出流,输出
用于一般输出流
ServletOutputStream outputStream = resp.getOutputStream();
用于写出 中文 字符串
PrintWriter writer = resp.getWriter();
2. 下载文件
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("下载文件");
//获取真实资源路径,此方法x
//String realPath = this.getServletContext().getRealPath("/水彩画.jpg");
String realPath = "D:\\....\\水彩画.jpg";
System.out.println(realPath);
// 获取文件名
String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 设置作为附件下载的响应头
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8")/*进行编码,防止中文乱码*/);
// 传输文件
FileInputStream is = new FileInputStream(realPath); //打开文件
ServletOutputStream os = resp.getOutputStream(); //获取输出流
int len;
byte[] buffer = new byte[1024]; //创建缓冲区
while ((len = is.read(buffer)) != -1) {
os.write(buffer,0,len); //写入
}
is.close();
os.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3. 展示随机数字的图片
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取验证码
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB); //创建一张图片
Graphics2D g = (Graphics2D) image.getGraphics();//获取2d画笔
g.setColor(Color.white);//选择颜色
g.drawRect(0, 0, 80, 40);//画实心矩形
g.setColor(Color.RED);//选择颜色
g.setFont(new Font("楷体", Font.BOLD, 16));//设置文字的样式
g.drawString(getRandomStr(), 10, 16);//画字符串
// 设置内容为图片jpg
resp.setContentType("image/jpg");
// 设置缓存控制为:不缓存
resp.setHeader("Cache-Control", "no-cache");
// 让浏览器每三秒刷新一次
resp.setHeader("refresh", "3");
// 写入图片
ImageIO.write(image, "jpg", resp.getOutputStream());
}
/**
* 获取随机数字的字符串
* @return 4位随机数字的字符串
*/
private String getRandomStr() {
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 4; i++) {
sb.append(random.nextInt(9));
}
return sb.toString();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4. 重定向302
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向到当前web应用的/image ,注意这里的uri要写全,
//req.getContextPath()表示当前web应用的路径
resp.sendRedirect(req.getContextPath()+"/image");
/*
*相当于
resp.setHeader("Location",req.getContextPath()+"/image");
resp.setStatus(HttpServletResponse.SC_FOUND);//302
*/
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
HttpServletRequest
1. 获取传递的参数
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决两个乱码问题,从req读取 和 向resp写入
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 获取传递的参数
String username = req.getParameter("username"); //单个参数,name值
String password = req.getParameter("password"); //单个参数,name值
String[] hobbies = req.getParameterValues("hobbies"); //多个参数,name值
// 请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Cookie
1. 获取cookie
获取所有cookie
Cookie[] cookies = req.getCookies();
2. 添加cookie
创建cookie
Cookie cookie = new Cookie("key","value");
添加cookie
resp.addCookie(cookie);
3. 设置有效期及删除cookie
设置cookie有效期。不设置默认为:关闭浏览器后删除
cookie.setMaxAge(time);
删除cookie:设置有效时间为0
cookie.setMaxAge(0);
重新添加cookie
resp.addCookie(cookie);
3. cookie信息获取
获取cookie名
String name = cookie.getName();
获取cookie值
String value = cookie.getValue();
### 4. 举例
```java
public class CookiesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码格式为utf-8
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 获取所有cookie
Cookie[] cookies = req.getCookies();
if (cookies != null) {
// cookies存在,查找是否有本站的cookie
for (Cookie cookie : cookies) {
if ("cookies-servlet-demo-1".equals(cookie.getName())) {
// 留有此网站的cookie
resp.setContentType("text/html");
resp.getWriter().println(
"自动登录成功,\ncookie: " + cookie.getValue());
// 删除cookie
cookie.setMaxAge(0);// 设置有效时间为0
resp.addCookie(cookie);// 重新添加cookie
return;
}
}
}
// cookie不存在
// 设置cookie
Cookie cookie = new Cookie("cookies-servlet-demo-1", LocalDateTime.now().toString()); //创建cookie
resp.addCookie(cookie); //添加cookie
// 输出信息
resp.setContentType("text/html");
resp.getWriter().println("这是你第一次登录此网站,");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpSession
1. 获取Session
从request中获取session
HttpSession session = req.getSession();
2. 存储与获取数据
存储数据到session,不一定是字符串
session.setAttribute("key", "value");
取出数据,可根据存储的类型 进行类型转换
String value = (String) session.getAttribute("key");
session信息会在服务器自动存储,实际底层会自动的将Session的id作为cookie发送给服务器,以标识身份。
如:resp.addCookie(new Cookie("JSESSIONID",req.getSession().getId()));
获取Session_id的方法
String id = session.getId();
3.删除与注销session
删除指定信息
session.removeAttribute("key");
注销这个session会话
session.invalidate();
4. 判断是否为新session
服务端未保存此session,或者用户禁止使用时返回true
boolean b = session.isNew()
5. web.xml中配置失效时间
<session-config>
<!-- 设置有效时间为1分钟 -->
<session-timeout>1</session-timeout>
</session-config>
6. 举例
public class SessionServlet 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");
HttpSession session = req.getSession();// 获取session
String value = null;
// 判断是否为新session
if (session.isNew()) {
// 存储数据,不一定是字符串
session.setAttribute("key", "value123123122232321");
resp.getWriter().println("欢迎新用户到来,");
} else {
resp.getWriter().println("你在此保留的信息为:");
// 取出数据,可根据存储的类型 进行类型转换
value = (String) session.getAttribute("key");
session.removeAttribute("key");// 删除指定信息
session.invalidate();//注销这个会话
}
resp.getWriter().println("key: " + value);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
附:
1. 中文乱码的解决
传输数据时出现中文乱码时使用URLEncoder和URLDecoder进行编码解码
String info = "str";
String code = URLEncoder.encode(info,"UTF-8");
// 数据传输...
String info = URLDecoder.decode(code,"UTF-8");