JSP/Servlet
B/S:浏览和服务器
C/S 客服端和服务器
Web服务器
lls
Tomcat
可以改动其最后的运行吗?
需要在Diver里面更改系统变量
Servlet
sun公司开发动态web的一门技术
Sun'在API提供一个接口叫做Servlet
编写一个类实现Servlet
开发好的Java类部署到Web服务器中
把实现了Servlet的接口JAVA程序,叫做Servlet
package com.qi.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
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 {
//由于get与post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletInputStream inputStream = req.getInputStream();输入流
//ServletOutputStream outputStream = resp.getOutputStream();输出流
PrintWriter writer = resp.getWriter();//响应流
writer.print("你好啊");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.qi.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
原因:Tomcat10之后包名不再是"javax.servlet”,则是改为"jakarta.servlet"
解决办法:
第一种解决办法:Tomcat版本改为10以下的版本
第二种解决办法:“javax.servlet”改为"jakarta.servlet”
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<!--类中的导入部分也需要更改
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-->
————————————————
版权声明:本文为CSDN博主「尘.埃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44881823/article/details/119848149
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
writer.print("<h1>404</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<!--注册404Servler-->
<servlet>
<servlet-name>404</servlet-name>
<servlet-class>com.qi.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>404</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
getServletContext
共享数据
放置的类
package com.qi.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// this.getInitParameter();//初始化参数
//this.getServletConfig();//Servlet配置
//this.getServletContext();//Servlet联系上下文
ServletContext context = this.getServletContext();
String s = "傻狗";//数据
context.setAttribute("username",s);//将一个数据保存在ServletContext中,名字为username 值为s
System.out.println("hello world");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
读取的类
package com.qi.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.getWriter().print("他名字是"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置文件
<?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">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.qi.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getcontext</servlet-name>
<servlet-class>com.qi.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getcontext</servlet-name>
<url-pattern>/name</url-pattern>
</servlet-mapping>
</web-app>
获取初始化参数
配置文件
<?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">
<!-- 配置web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybits</param-value>
</context-param>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.qi.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getcontext</servlet-name>
<servlet-class>com.qi.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getcontext</servlet-name>
<url-pattern>/name</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>gp</servlet-name>
<servlet-class>com.qi.servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gp</servlet-name>
<url-pattern>/gp</url-pattern>
</servlet-mapping>
</web-app>
读取文件
package com.qi.servlet;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
请求转发
package com.qi.servlet;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了Sd4");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
//requestDispatcher.forward(req,resp);//调用forward实现请求转发
context.getRequestDispatcher("/gp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
读取资源文件
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user);
resp.getWriter().print(pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpServletResponse
简单分类
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取下载文件路径
// String realPath = this.getServletContext().getRealPath("/1.jpg");
String realPath = "C:\\Users\\V556U\\Desktop\\springboot\\com.du.study.servlet\\response\\target\\classes\\1.jpg";
System.out.println("文件路径"+realPath);
// 下载文件名是啥
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 设置想办法让浏览器能够支持我们需要的东西
resp.setHeader("Content-Disposition","attchment;filename="+fileName);
// 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 获取OutputStram对象
ServletOutputStream out = resp.getOutputStream();
// 将FileOutputStream流写入到buffer缓冲区
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
// 使用OutputStream将缓冲区中的数据输出到客户端
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
验证码功能
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器5秒响应一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D graphics = (Graphics2D) image.getGraphics();//笔
//设置图片背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.blue);
graphics.setFont(new Font(null,Font.BOLD,20));
graphics.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片方式打开
resp.setContentType("image/jpeg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成随机数
private String makeNum() {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
for (int i =0;i< 7 - num.length(); i++) {
sb.append("0");
}
num = sb.toString() + num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
实现重定向
resp.sendRedirect("/img");
/*
* 等价于
* resp.setHeader("Location","/r/img");
* resp.setStatus(302);
*
*/
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入这个请求");
//请求处理
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
//注意路径问题
resp.sendRedirect("/response_war/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpServletRequest
得到 前端参数
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("=============================");
//
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.toString(hobbys));
System.out.println("=============================");
//通过请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
resp.setCharacterEncoding("utf-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
Cookie与Session
会话
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
//中文数据传输
public class CookieDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
resp.setHeader("Content-type", "text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
//Cookie服务器从客服端获取的
Cookie[] cookies = req.getCookies();//cookie可能返回多个获得cookie
//判断Cookie是否存在
if (cookies!=null){
//如果存在
out.write("你上次访问的时间:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取Cookie的名字key
if (cookie.getName().equals("name")){
//获得cookie中的值
out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
System.out.println(cookie.getValue());
}
}
}else {
out.write("这是第一次访问本站");
}
Cookie cookie = new Cookie("name", URLEncoder.encode("杜淇","utf-8"));
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
显示不出来,需要编码解码,注意字符串
Session
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setHeader("Content-type", "text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//得到Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name","杜淇");
//获取Session的ID
String id = session.getId();
//判断Session是不是新创建
if (session.isNew()){
resp.getWriter().write("Session创建,Id="+id);
}else {
resp.getWriter().write("Session已经创建,id为"+id);
}
//Session在创建是做了些什么
// Cookie cookie = new Cookie("JSESSIONID", id);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
也可以传输对象
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setHeader("Content-type", "text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//得到Session
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.qi.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
public class SessionDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.removeAttribute("name");
//注销
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
默认注销
<?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">
<servlet>
<servlet-name>CookieDemo01</servlet-name>
<servlet-class>com.qi.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo01</servlet-name>
<url-pattern>/c1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CookieDemo02</servlet-name>
<servlet-class>com.qi.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo02</servlet-name>
<url-pattern>/c2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CookieDemo03</servlet-name>
<servlet-class>com.qi.servlet.CookieDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo03</servlet-name>
<url-pattern>/c3</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionDemo01</servlet-name>
<servlet-class>com.qi.servlet.SessionDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo01</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionDemo02</servlet-name>
<servlet-class>com.qi.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo02</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SessionDemo03</servlet-name>
<servlet-class>com.qi.servlet.SessionDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionDemo03</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
<!-- 设置Session的默认失效时间-->
<session-config>
<!-- 15分钟后自动失效,以分钟为单位 -->
<session-timeout>15</session-timeout>
</session-config>
</web-app>
JSP
1、判断请求
2、内置一些对象
3、输出页面前增加的代码
4、以上的这些对象我们可以在JSP页面直接使用
在JSP页面中java代码直接输出,Html就会转化为out.wtite()输出
JSP基础语法
JSP表达式
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--JSP表达式
作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
</body>
</html>
脚本片段
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--JSP表达式
作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100; i++) {
sum+=1;
}
System.out.println("<h1>sum="+sum+"</h1>");
%>
</body>
</html>
脚本 片段的再实现
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--JSP表达式
作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100; i++) {
sum+=i;
}
out.println("<h1>sum="+sum+"</h1>");
%>
<%
int x =10;
out.println(x);
%>
<p>这是一个Jsp文档</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--在代码中嵌入Html元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>helloword <%=i%></h1>
<%
}
%>
</body>
</html>
JSP声明
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--JSP表达式
作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
int sum = 0;
for (int i = 1; i <=100; i++) {
sum+=i;
}
out.println("<h1>sum="+sum+"</h1>");
%>
<%
int x =10;
out.println(x);
%>
<p>这是一个Jsp文档</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--在代码中嵌入Html元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>helloword <%=i%></h1>
<%
}
%>
<hr>
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void qi(){
System.out.println("进入qi");
}
%>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: V556U
Date: 2021/9/16
Time: 21:31
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>
<%--内置对象--%>
<%
pageContext.setAttribute("name1","啊1");//保存数据只在一个页面中有效
request.setAttribute("name2","啊2");//保存数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","啊3");// 保存的数据只在一次会话中有效,从打开浏览器到关闭
application.setAttribute("name4","啊4");//保存的数据在服务器中有效
%>
<%--脚本片段中的代码,会原封不懂的生成jsp中,需要保证java语法的正确性--%>
<%
//从pageContext中取出,通过寻找的方式来取
//从底层到高层(作用域):page->request->session->application
//JVM:双亲委派机制
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出${}}--%>
<h1>取出值为</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%--<h3>${name5}</h3>--%>
<h3><%=name5%></h3>
</body>
</html>
request:客户端向服务器发送请求,产生数据,用户看完就没用了,比如新闻,用户看完没用的
session:客户端向服务器发送请求,产生数据,用户看完一会还有用,比如购物车;
application:客户端向服务器发送请求,产生数据,一个用户用完了,其他用户还可能使用,比如聊天数据
JSP标签,JSTL标签,EL标签
导包
<!-- jstl表达式依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2-rev-1</version>
</dependency>
<!-- standard依赖 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
EL表达式 ${ }
JSP标签
<h1>这里是tag1</h1>
<%--<jsp:include page="error/500.jsp"></jsp:include>--%>
<jsp:forward page="jsptag2.jsp">
<jsp:param name="value1" value="value1"/>
<jsp:param name="value2" value="value2"/>
</jsp:forward>
JSTL标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
if
c:choose
c:foreach
JAVABean
id | name | age | address |
1 | a | 11 | 系统 |
2 | b | 12 | 相同 |
3 | c | 14 | 仙桃 |
class person{
private int id;
private String name;
private int age;
private String address;
}
class A{
new person(1,"d",14,"下图");
}
<%@ page import="com.qi.entity.People" %><%--
Created by IntelliJ IDEA.
User: V556U
Date: 2021/9/17
Time: 14:09
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>
<%
// People people = new People();
// people.setAddresss("仙桃");
// people.setAge(11);
// people.setId(1);
// people.setName("a");
//
// people.getAddresss();
// people.getAge();
// people.getId();
// people.getName();
%>
<jsp:useBean id="people" class="com.qi.entity.People" scope="page"/>
<jsp:setProperty name="people" property="addresss" value="仙桃"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="11"/>
<jsp:setProperty name="people" property="name" value="a"/>
姓名=<jsp:getProperty name="people" property="name"/>
年龄=<jsp:getProperty name="people" property="age"/>
地址=<jsp:getProperty name="people" property="addresss"/>
id=<jsp:getProperty name="people" property="id"/>
</body>
</html>
MVC三层架构
三层架构
Filter
package com.qi.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("C初始化");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//1.过滤所有代码,在过滤特定的请求的时候都会执行
//2.必须让过滤器继续执行
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("C执行前");
chain.doFilter(request, response);//让我们请求继续走,不然就被拦截
System.out.println("C执行后");
}
//web服务器停止
public void destroy() {
System.out.println("C'销毁");
}
}
3.在WEBXML配置
<?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">
<servlet>
<servlet-name>ServletShow</servlet-name>
<servlet-class>com.qi.servlet.ServletShow</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletShow</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletShow</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.qi.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只要是/servlet的任何请求都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
监听器
package com.qi.listener;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
//统计网站在线人数,统计session
public class OnlineCountListener implements HttpSessionListener {
//创建Session监听
//创建一次执行一次
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
//销毁Session监听
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
}
<?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">
<servlet>
<servlet-name>ServletShow</servlet-name>
<servlet-class>com.qi.servlet.ServletShow</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletShow</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletShow</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.qi.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!-- 只要是/servlet的任何请求都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.qi.listener.OnlineCountListener</listener-class>
</listener>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>
过滤器与监听器常见使用
package com.qi.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//ServletRequest HttpServletRequst
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
Object user_session = request.getSession().getAttribute("USER_SESSION");
if (user_session==null){
response.sendRedirect("/error.jsp");
}
chain.doFilter(req,resp);
}
public void destroy() {
}
}
JDBC
SQL创建表格
CREATE TABLE users(
id INT PRIMARY KEY,
`name` VARCHAR(40),
`password` VARCHAR(40),
email VARCHAR(60),
birthday DATE
);
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(2,'张三','123456','akahdk@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(4,'李四','123456','akahdk@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(5,'王五','123456','akahdk@qq.com','2000-01-01');
导入数据依赖包
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
IDEA中链接数据库
JDBC固定步骤
package com.qi.test;
import com.mysql.jdbc.Driver;
import java.sql.*;
public class TestJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//配置信息
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
String username = "root";
String password = "root";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.链接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.向数据库发送SQL的对象Statement:CURD 和 PreparedStatement
Statement statement = connection.createStatement();
//4.编写SQL
String sql = "select * from users";
//5.执行SQL,返回一个结果集
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id"+resultSet.getObject("id"));
System.out.println("name"+resultSet.getObject("name"));
System.out.println("password"+resultSet.getObject("password"));
System.out.println("email"+resultSet.getObject("email"));
System.out.println("birthday"+resultSet.getObject("birthday"));
}
//6.关闭链接释放资源 先开后关
resultSet.close();
statement.close();
connection.close();
}
}
预编译SQL
package com.qi.test;
import java.sql.*;
public class TestJdbc2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//配置信息
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
String username = "root";
String password = "root";
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.链接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3.编写SQL
//String sql = "select * from users";
String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?);";
//4.预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,9);//给第一个占位符?的值赋值为1;
preparedStatement.setString(2,"爱迪生");//给第二个占位符?的值赋值为爱迪生;
preparedStatement.setString(3,"123456");//给第三个占位符?的值赋值为123456;
preparedStatement.setString(4,"ad@qq.com");//给第四个占位符?的值赋值为ad@qq.com;
preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符?的值赋值为1;
//5.执行SQL
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("执行成功");
}
//6.关闭链接释放支援,先开后放
preparedStatement.close();
connection.close();
}
}
事务
事务代码
package com.qi.test;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestJdbc3 {
@Test
public void test() {
//配置信息
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
String username = "root";
String password = "root";
Connection connection = null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//2.链接数据库,代表数据库
connection = DriverManager.getConnection(url, username, password);
//3.通知数据库,开启事务,faler是开启,true是关闭
connection.setAutoCommit(false);
String sql = "update account set money = money-100 where name = 'A';";
connection.prepareStatement(sql).executeUpdate();
//制造错误
//int i=1/0;
String sql1 = "update account set money = money+100 where name = 'B';";
connection.prepareStatement(sql).executeUpdate();
connection.commit();//以上两条sql都成功,就提交
System.out.println("success");
} catch (ClassNotFoundException | SQLException e) {
try {
//如果出现异常,就回滚
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}