一、Java开发web应用程序
(一) Servlet 服务器端的程序
所有 servlet 需要继承 HttpServlet 父类
覆盖父类中的 service(HttpServletRequest request, HttpServletResponse response) {
}
在类上加一个注解 @WebServlet(urlPattern="/路径")
响应:
@WebServlet(urlPatterns = "/date")
public class MyServlet extends HttpServlet {
@Override
// req 请求 resp 响应
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应的字符编码
resp.setCharacterEncoding("utf-8");
// 告知浏览器,请浏览器用 utf-8 编码来显示
resp.setContentType("text/html;charset=utf-8");
String html = "<html><body><h1>" + new Date() +"</h1></body></html>";
// 将一段 html 作为响应内容,写入输出流
resp.getWriter().print(html);
}
}
请求:
@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>");
}
}
注:写在src-新建包下或maven-src-main-java-新建包下
(二) JSP (java server page) 动态html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Address already in bind 8080
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>现在时间是:<% out.print(new Date()); %></h1>
</body>
</html>
注:写在web下或maven-src-main-webapp下
二、Servlet 的生命周期
- 当 servlet 首次被访问时 ,调用构造方法,只调用一次(只有一个servlet对象被创建)
- 紧接着调用初始化 init 方法,也是只调用一次
- 根据请求方式,调用 service,或 doGet 或 doPost (请求几次,就会被调用几次)
- 当应用程序停止前,调用 destroy 方法,只调用一次
这些方法都是由 tomcat 容器来调用, 这种方式称之为控制反转
Servlet 默认是在第一次访问时被加载,也可以配置服务器启动时被加载 loadOnStartup = 数字
数字代表优先级,数字小的表示优先级高,还可以设置初始化参数
三、Servlet
(一) 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")
(二) request重要方法
四、JSP中的常见表单项和事件
(一) disabled和readonly
disabled 表单项 提交时不会发送给服务器
readonly 表单项 提交时会发送给服务器
onsubmit 事件 会在表单提交之前触发,若返回为真表单则可提交,若为假则不能提交
<input type="text" name="username" value="张三" disabled />
<input type="text" name="username" value="张三" readonly />
<form action="servlet1" method="post" οnsubmit="return false">
(二) 下拉列表
没有给 value, 就会把文字发送给服务器 ,若给了 value, 会把 value 的值发给服务器
<p>
<!-- multiple,多选 -->
<select name="city" multiple>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shengzhen">深圳</option>
</select>
</p>
五、请求与响应
(一) 请求
- 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,如果有中文,会自动编码
(二) 响应
- 状态码
- 200 表示响应正确返回
- 404 表示请求的资源不存在
- 500 表示服务器内部出现了异常
- 304 表示该内容没有被修改,那么服务器只会返回状态码和头,不需要返回响应体(图片,html,css,js)
- 响应头
-
content-type: 响应的内容格式, 例如 text/html;charset=utf8
-
content-length: 响应体的长度(字节)
-
Date: 响应生成时间
- 响应体
- html内容,图片内容
六、返回动态图片
@WebServlet(urlPatterns = "/servlet2")
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.GREEN);
g.fillRect(0,0,200,100);
// 写入文字
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑", Font.ITALIC, 32));
String s = random(4);
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 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
public String random(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
int idx = random.nextInt(str.length()); // 随机的下标
sb.append(str.charAt(idx));
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println("abcdefghijklmnopqrstuvwxyz".toUpperCase());
}
}
!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function changeImage() {
document.getElementById("img").src= "servlet2?a=" + new Date().getTime();
}
</script>
</head>
<body>
<img src="img/1.jpg"/>
<img src="servlet2" onclick="changeImage()" id="img">
</body>
</html>
七、请求转发
由于servlet中实现html代码并不方便,而jsp格式中实现java代码是一种反模式。所以需要利用请求转发,利用servlet来处理表单请求 , 跳转至jsp来生成html代码并返回。
- 请求转发
request.getRequestDispatcher("jsp路径").forward(request, response);
- 作用域传参,把servlet中的变量传递给jsp显示
- 存
request.setAttribute("变量名", 对象);
- 取(在jsp页面),通过 EL 表达式取
${ 变量名 }
${ 变量名.属性名 } el 表达式中的属性名,对应着java对象中的 get,set方法名。java8后可以直接调用get方法来获取参数