本人已参与[新人创作礼]活动,一起开启掘金创作之路。
一、JavaWeb技术栈
二、HTTP
三、HTTP-请求数据格式
四、HTTP-响应数据格式
五、Web服务器
web服务器作用:
*封装HTTP协议操作,简化开发
*可以将web项目部署到服务器中,对外提供网上浏览服务
*Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称Web容器,Servlet容器。
六、Servlet技术
package cn.hncj;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* Created on 2022/3/24.
*
* @author Hou chaof
*/
public class MyHttpServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//根据请求方式不同,进行分别的处理
HttpServletRequest request= (HttpServletRequest)req;
//1.获取请求方式
String method = request.getMethod();
//2.判断
if ("GET".equals(method)){
//get方式的处理逻辑
doGet(req,res);
}else if ("POST".equals(method)){
//post方式的处理逻辑
doPost(req,res);
}
}
protected void doPost(ServletRequest req, ServletResponse res) {
}
protected void doGet(ServletRequest req, ServletResponse res) {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
package cn.hncj;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* Created on 2022/3/24.
*
* @author Hou chaof
*/
@WebServlet("/demo2")
public class ServletDemo2 extends MyHttpServlet {
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println("get!!!!!");
}
@Override
protected void doPost(ServletRequest req, ServletResponse res) {
System.out.println("post!!!!!!");
}
}
七、urlPattern配置
八、request、response
package cn.hncj;
/**
* Created on 2022/3/24.
*
* @author Hou chaof
*/
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;
/**
* Description: urlPattern: 一个Servlet可以配置多个访问路径
* @date:2022/3/24 20:52
* @params:
* @return:
*/
@WebServlet(urlPatterns = {"/demo3"})
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用req对象,获取请求参数
String name = req.getParameter("name"); //url?name=zhangsan
//使用resp对象,设置响应数据
resp.setHeader("context-type","text/html;charset=utf-8");
resp.getWriter().write("<h1>"+name+",hello!!+</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
页面显示如下:
8.1学习Request
Request 继承体系:
Request 获取请求数据:
Request通用方式获取请求参数:
package cn.hncj;
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;
import java.util.Map;
/**
* Created on 2022/3/25.
*
* @author Hou chaof
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取所有参数的map集合
Map<String, String[]> map = req.getParameterMap();
//for循环遍历: 集合内存储类型为字符串 变量名s: 集合变量名.获取Map集合的所有键名
for (String key : map.keySet()) {
//username:zhangsan 的格式,下输出不换行
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + "");
}
System.out.println();
}
System.out.println("----------------");
//2.根据key获取参数值,数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//3.根据key 获取单个参数值
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<form action="/req1" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="1"> 游泳
<input type="checkbox" name="hobby" value="2"> 爬山<br>
<input type="submit">
</form>
</body>
</html>
Request请求参数中文乱码处理
package cn.hncj;
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;
import java.nio.charset.StandardCharsets;
/**
* Created on 2022/3/25.
*
* @author Hou chaof
*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post乱码 POST.getReader()
req.setCharacterEncoding("utf-8");//设置字符输入流的编码
//获取username
String username = req.getParameter("username");
System.out.println(username);
//GET获取参数的方式:getQueryString
//对乱码数据进行解码,转为字节数组
//byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//字节数组解码
//username = new String(bytes, StandardCharsets.UTF_8);
username=new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println("解决乱码后"+ username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
Request 请求转发:
package cn.hncj;
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;
import java.nio.charset.StandardCharsets;
/**
* Created on 2022/3/25.
* 请求转发
* @author Hou chaof
*/
@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3...");
//存储数据
req.setAttribute("msg","hello");
//请求转发
req.getRequestDispatcher("/req4").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
package cn.hncj;
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;
import java.nio.charset.StandardCharsets;
/**
* Created on 2022/3/25.
*
* @author Hou chaof
*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dmeo4....");
//获取数据
Object msg = req.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
访问http://localhost:8080/req3,控制台会输出hello,证明数据共享完成。
8.2 学习Response
Response 设置响应数据功能介绍
Response 完成重定向
package cn.hncj.response;
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;
/**
* Created on 2022/3/25.
*
* @author Hou chaof
*/
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp1...");
//重定向
//1.设置响应状态码 302
//resp.setStatus(302);
//2.设置响应头 location
//resp.setHeader("Location","/resp2");
//动态获取虚拟目录
String contextPath = req.getContextPath();
//简化方式完成重定向
resp.sendRedirect(contextPath+"/resp2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
Response响应字符数据
w
package cn.hncj.response;
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;
import java.io.PrintWriter;
/**
* Created on 2022/3/25.
* 相应字符数据: 设置字符数据的响应体
* @author Hou chaof
*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8"); //解决中文乱码
//1.获取字符输出流
PrintWriter writer = resp.getWriter();
//resp.setHeader("content-type","text/html");
writer.write("你好");
writer.write("<h1>bbbb</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
Response响应字节数据:
package cn.hncj.response;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Created on 2022/3/25.
* 响应字节数据:设置字节数据的响应体
*
* @author Hou chaof
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.读取文件
FileInputStream fis = new FileInputStream("D://a.jpg");
//2.获取response字节输出流
ServletOutputStream os = resp.getOutputStream();
//3.完成流的copy
// byte[] buff=new byte[1024];
//int len=0;
// while ((len=fis.read(buff))!= -1){
// os.write(buff,0,len);
// }
IOUtils.copy(fis, os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}