Servlet 与 JSP
- nginx 可以部署静态内容
- tomcat 可以部署动态内容
常见操作
- startup.bat
- shutdown.bat ctrl+C 找后台 java 进程
- server.xml
- 可以端口,配置字符集,虚拟主机 …
maven
pom.xml GAV 坐标
<dependency>
<groupId>组织
<artifactId>项目
<version>版本
</dependency>
servlet 服务器端小程序
@WebServlet(urlPatterns="/映射路径")
class MyServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException{
// 处理请求和响应的代码
String 参数值 = request.getParameter("请求参数名");
// 用response返回响应
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("<html>");
}
}
jsp 也可以动态html
<%@page contentType="text/html;charset=utf-8" language="java"%>
<html>
<%
java
%>
</html>
==============================
Servlet
1. post 请求中的汉字会有乱码问题(重点)
原因:
String sex = URLEncoder.encode("男", "utf-8");
System.out.println(sex);
// iso-8859-1
String result = URLDecoder.decode("%E7%94%B7", "iso-8859-1");
System.out.println(result); // ç”·
解决方法,在调用 getParameter 方法之前:
request.setCharacterEncoding("utf-8")
2. request 重要方法(重点)
request.getParameter("参数名") ==> 返回参数值
request.getParameterValues("参数名") ==> 返回参数值的数组
request.setCharacterEncoding("解码的字符集");
request.getMethod(); ==> 返回请求方式 get, post
request.getRequestURI(); ==> 返回当前的请求路径
request.getRemoteAddr(); ==> 获取访问者的ip地址
3. 一个请求分别几个部分(了解)
GET 两个部分
GET 路径/HTTP 1.1 ==> 请求行
请求头
Host: 要访问那个虚拟主机 一个服务器下有多有 host, 每一个host 下,又有多个应用程序
Accept: 可以处理的内容格式:例如 text/html
Accept-Encoding : 能够支持的压缩格式
Accept-Language : 支持的语言, 例如 zh-CN
POST 三个部分
Content-Type: 请求体的格式 application/www-form-urlencoded (普通表单格式)
Content-Length: 请求体内容的长度
请求体
post的请求参数放入了请求体当中,例如:username=zhangsan&password=123
如果有中文,会自动编码
4. 响应分成3个部分(了解)
-
状态码
- 200 表示响应正确返回
- 404 表示请求的资源不存在
- 500 表示服务器内部出现了异常
- 304 表示该内容没有被修改,那么服务器只会返回状态码和头,不需要返回响应体(图片,html,css,js)
- 400 请求参数格式有误.
- 403 验证没通过,或权限不足
-
响应头
- content-type: 响应的内容格式, 例如 text/html;charset=utf8
- content-length: 响应体的长度(字节)
- Date: 响应生成时间
-
响应体
html内容,图片内容
5. 返回一个动态图片(了解)
package web;
import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(urlPatterns = "/servlet1")
public class Servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 图片验证码
// 1. 创建图片对象, 构造参数分别代表 宽、高、图片格式
BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
// 2. 创建画布对象
Graphics2D g = image.createGraphics();
// 3. 填充画布
g.setColor(Color.cyan);
g.fillRect(0,0,200,100);
//写入文字
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑", Font.ITALIC, 32));
String s = random();
g.drawString(s,0,32);
g.setColor(Color.RED);
g.drawLine(0,0,200,100);
// 4. 把图片内容输出到响应
resp.setContentType("image/png");
// 参数1 图片对象, 参数2 图片压缩格式 png|jpeg, 参数3: 输出字节流
ImageIO.write(image,"png",resp.getOutputStream());
}
Random random = new Random();
String str = "abcdefghijklmnopqrsnuvwxyz1234567890";
public String random(){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int i1 = random.nextInt(str.length());
sb.append( str.charAt(i1));
}
return sb.toString();
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function changeImg() {
document.getElementById("imge").src = "servlet1?a="+new Date().getTime();
}
</script>
</head>
<body>
<img src="servlet1" onclick="changeImg()" id="imge"/>
</body>
</html>
6. 请求转发(重点)
servlet 中还是用来处理表单请求
跳转至jsp (请求转发)
jsp 用来生成html代码并返回
request.getRequestDispatcher("jsp路径").forward(request, response);
如何把servlet中的变量传递给jsp显示
作用域传参
存
request.setAttribute("变量名", 对象);
取(在jsp页面),通过 EL 表达式取
${ 变量名 }
${ 变量名.属性名 } el 表达式中的属性名,对应着java对象中的 get,set方法名
getUsername()
package web;
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(urlPatterns = "/servlet3")
public class Servlet3 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet中执行的操作");
User user = new User("张三", "23");
req.setAttribute("u",user);
req.getRequestDispatcher("2.jsp").forward(req,resp);
}
}
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/1/14
Time: 11:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>返回jsp消息</p>
获取作用域中的变量值
<hr>
${u.userName} ${u.password}
</body>
</html>