JavaWeb知识梳理(后端部分)
JavaWeb
静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。
动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。
静态web资源开发技术:HTML、CSS、JavaScript。
动态web资源开发技术:JSP/Servlet、ASP、PHP等。在Java中,动态web资源开发技术统称为Java Web。

Web服务器
技术讲解
ASP:微软,国内最早流行的是ASP,在HTML中嵌入了VB的脚本,ASP+COM,维护成本高。
PHP:开发速度很快,功能很强大,跨平台,代码简单,但是无法承载大访问量的情况(局限性)。
JSP/Servlet:sun公司主推的B/S架构,基于java语言,可以承载三高问题(高并发,高可用,高性能)。
B/S:浏览器和服务器;C/S:客户端和服务器。
Web服务器
服务器用来处理用户的一些请求,响应给用户一些数据。
IIS:微软的,主要用于ASP,Windows中自带的服务器。
**Tomcat:**Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个JavWeb初学者来说,是最好的选择。
Tomcat 实际上运行JSP 页面和Servlet。
Tomcat
安装Tomcat:官网下载(tomcat.apache.org/)压缩包,解压至指定目…
在bin目录下点击startup.bat启动,在浏览器网址栏输入localhost:8080测试。
网站是如何进行访问的:
- 输入用户名,回车
- 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件有没有这个域名的映射
- 有就直接返回对应的ip地址
- 没有就去DNS(全世界的域名管理)服务器上寻找,找到就返回
Http
Http(超文本传输协议):http是一个简单的请求-响应协议,它通常运行在TCP之上。(默认端口:80)
Https:443
- Http1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接。
- Http1.1:客户端可以与web服务器连接后,可以获得多个web资源。
Http请求
- 客户端----发请求----服务器

Http响应
- 服务器----发请求----客户端

请求方式:
get:请求能够携带的参数比较少,大小有限制,会在浏览器地址栏显示参数的内容,不安全,但是高效。
post:请求能够携带的参数没有限制,大小没有限制,不会再浏览器地址栏显示参数的内容,安全,但不高效。
响应状态码:
200:请求响应成功
3**:请求重定向
404:找不到资源
500:服务器代码错误,502:网关错误
Maven
Maven:项目架构管理工具,自动导入jar包(约定大于配置)。
下载Maven后解压,配置环境变量,将bin目录的路径配置到path中,在cmd中输入mvn-version,查看是否配置成功
在conf目录下setting的 下配置本地仓库
D:\Environments\apache-maven-3.6.3\maven-repo
在conf目录下setting的 中配置阿里云的镜像

pom.xml
pom.xml:maven的核心配置文件
由于maven的约定大于配置,我们之后写的配置文件可能无法导出或者无法生效,就需要在maven配置下面配置resouce。
Servlet
servlet就是sun公司开发动态web的一门技术,sun公司在API中提供了一个接口叫Servlet,如果需要开发一个Servlet程序,需要编写一个类去实现Servlet接口,再把开发好的java类部署到web服务器中。
HelloServlet
sun公司有两个Servlet接口的默认实现类:HttpServlet和GenericServlet
-
构建一个maven项目,删除里面的src项目,以后就直接新建model,这个空的工程就是Maven的主工程。
-
关于Maven父子工程的理解:
父项目中会有
<modules><module>servlet-01</module>
</modules>
子项目中有
<parent><artifactId>javaweb-02-servlet</artifactId><groupId>com.zr</groupId><version>1.0-SNAPSHOT</version></parent>
3.Maven环境优化:修改web.xml为最新的,将Maven的结构搭建完整。
4.编写一个普通类,实现Servlet接口,继承HttpServlet。
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream = resp.getOutputStream();PrintWriter writer = resp.getWriter(); //响应流writer.println("Hello Servlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
5.编写Servlet的映射:我们写的是java程序,但是要通过浏览器访问,而浏览器要连接web服务器,所以我们要在web服务器注册我们写的Servlet,还需要给它一个浏览器能够访问的路径。
<!--注册Servlet-->
<servlet><servlet-name>hello</servlet-name><servlet-class>com.zr.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置Tomcat
7.启动测试
Servlet原理
Servlet是由Web服务器调用,web服务器收到请求后,会进行以下操作:

Mapping
-
一个Servlet可以指定一个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping> -
一个Servlet可以指定多个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello2</url-pattern>
</servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello3</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4.默认请求
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping>
5.一个Servlet可以指定一些后缀或者前缀映射路径
<!--*前面不能加任何映射的路径-->
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>*.zzr</url-pattern>
</servlet-mapping>
优先级问题:
指定了固有的映射路径,优先级最高,找不到就会走默认的处理请求。
处理404页面
<!--404-->
<servlet><servlet-name>error</servlet-name><servlet-class>com.zr.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>error</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping>
ServletContext
web容器在启动的时候,它会为每一个web程序都创建一个ServletContext对象,它代表了当前的 web应用。
-
共享数据
我在这个Servle中保存的数据可以在另外一个Servle中拿到
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello");//this.getInitParameter(); 初始化参数//this.getServletConfig(); Servlet的配置//this.getServletContext(); Servlet上下文ServletContext context = this.getServletContext();String username = "周周";context.setAttribute("username",username);//将一个数据保存在ServletContext中}
}
public class GetServlet extends HttpServlet {@Overrideprotected 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().println("名字:"+username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}
<servlet><servlet-name>hello</servlet-name><servlet-class>com.zr.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet><servlet-name>get</servlet-name><servlet-class>com.zr.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>get</servlet-name><url-pattern>/get</url-pattern>
</servlet-mapping>
测试访问结果
1.获取初始化参数
<!--配置一个web应用的初始化参数-->
<context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/mybaits</param-value>
</context-param><servlet><servlet-name>gp</servlet-name><servlet-class>com.zr.servlet.ServletDemo03</servlet-class></servlet><servlet-mapping><servlet-name>gp</servlet-name><url-pattern>/gp</url-pattern></servlet-mapping>
public class ServletDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();String url = context.getInitParameter("url");resp.getWriter().println(url);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
2.请求转发
public class ServletDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径requestDispatcher.forward(req,resp);//转发}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
<servlet><servlet-name>sd4</servlet-name><servlet-class>com.zr.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping><servlet-name>sd4</servlet-name><url-pattern>/sd4</url-pattern>
</servlet-mapping>
读取资源文件
properties
- 在Java目录下新建propreties(需要在pom.xml下配置resources)
- 在resources目录下新建properties
发现都被打包到了target下的class目录下,我们称这个路径为类路径classpath。
public class ServletDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");Properties properties = new Properties();properties.load(is);String username = properties.getProperty("username");String password = properties.getProperty("password");resp.getWriter().println("username:"+username);resp.getWriter().println("password:"+password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<servlet><servlet-name>sd5</servlet-name><servlet-class>com.zr.servlet.ServletDemo05</servlet-class>
</servlet>
<servlet-mapping><servlet-name>sd5</servlet-name><url-pattern>/sd5</url-pattern>
</servlet-mapping>
<build><resources><resource><directory>src/main/resources</directory><excludes><exclude>**/*.properties</exclude><exclude>**/*.xml</exclude></excludes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource></resources>
</build>
//文件 db.properties
username=root
password=123456
HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse。
- 如果要获取客户端请求过来的参数:HttpServletRequest
- 如果要给客户端响应一些信息:HttpServletResponse
简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;PrintWriter getWriter() throws IOException;
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);
响应的状态码
int SC_OK = 200;
...
int SC_MULTIPLE_CHOICES = 300;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
...
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_BAD_GATEWAY = 502;
下载文件
-
向浏览器输出消息
-
下载文件
- 获取下载文件的路径
- 下载的文件名
- 让浏览器支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获得OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 将OutputStream缓冲区中的对象输出到客户端
public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取下载文件的路径String realPath = "D:\\IDEACode\\javaweb-02-servlet\\response\\src\\main\\resources\\1.PNG";System.out.println("下载文件的路径:"+realPath);//2. 下载的文件名String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//3. 让浏览器支持下载我们需要的东西resp.setHeader("Content-Disposition","attachment;filename="+fileName);//4. 获取下载文件的输入流FileInputStream in = new FileInputStream(realPath);//5. 创建缓冲区int len = 0;byte[] buffer = new byte[1024];//6. 获得OutputStream对象ServletOutputStream out = resp.getOutputStream();//7. 将FileOutputStream流写入到buffer缓冲区 将OutputStream缓冲区中的对象输出到客户端while ((len=in.read(buffer))>0){out.write(buffer,0,len);}in.close();out.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
验证码功能
如何生成验证码:
- 前端
- 后端:需要用Java的图片类,生成一个图片
public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//让浏览器5秒刷新一次resp.setHeader("refresh","5");//创建图片BufferedImage image = new BufferedImage(300,60,BufferedImage.TYPE_INT_RGB);//得到图片Graphics g = image.getGraphics(); //笔//设置图片的背景颜色g.setColor(Color.green);g.fillRect(0,0,300,60);//给图片写数据g.setColor(Color.magenta);g.setFont(new Font(null,Font.BOLD,70));g.drawString(makeNum(),0,60);//浏览器以图片的形式打开resp.setContentType("image/png");//网站存在缓存。不让浏览器缓存resp.setDateHeader("expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");//把图片显示出来boolean write = 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;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<!--注册Servlet-->
<servlet><servlet-name>image</servlet-name><servlet-class>com.zr.servlet.ImageServlet</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping><servlet-name>image</servlet-name><url-pattern>/image</url-pattern>
</servlet-mapping>
实现重定向
void sendRedirect(String var1) throws IOException;//重定向
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {/*resp.setHeader("Location","/r/image");resp.setStatus(302);*/resp.sendRedirect("/r/image");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
配置web.xml测试
重定向和转发的区别:
相同点:页面都会发生跳转
不同点:
- 请求转发的时候,url不会改变 307
- 重定向的时候,url地址栏会发生变化 302
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--提交的路径需要寻找到当前项目的路径--%>
<form action="${pageContext.request.contextPath}/login" method="post">用户名:<input type="text" name="username"><br>密码 :<input type="password" name="password"><br><input type="submit"></form>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
public class RequestTest extends HttpServlet {@Overrideprotected 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:"+username);System.out.println("password:"+password);resp.sendRedirect("/r/success.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<!--注册Servlet-->
<servlet><servlet-name>test</servlet-name><servlet-class>com.zr.servlet.RequestTest</servlet-class>
</servlet>
<!--Servlet请求路径-->
<servlet-mapping><servlet-name>test</servlet-name><url-pattern>/login</url-pattern>
</servlet-mapping>
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有的信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");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));//请求转发//这里的/代表当前的web应用req.getRequestDispatcher("/success.jsp").forward(req,resp);}
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center"><form action="${pageContext.request.contextPath}/login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>爱好:<input type="checkbox" name="hobbys" value="唱歌">唱歌<input type="checkbox" name="hobbys" value="女孩">女孩<input type="checkbox" name="hobbys" value="写字">写字<input type="checkbox" name="hobbys" value="代码">代码<br><input type="submit"></form></div>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
web.xml
<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.zr.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern>
</servlet-mapping>
Cookie, Session
cookie
- 客户端技术(响应,请求)
session
- 服务器技术,可以保存用户的会话信息,我们可以把信息或数据放在session中
常见应用:网站登录一次后,下次可以直接进入。
Cookie
从请求中拿到cookie信息
服务器响应给客户端cookie
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out= resp.getWriter();//cookie,服务器端从客户端获取Cookie[] cookies = req.getCookies();//返回数组,cookie可能存在多个//判断cookie是否存在if (cookies!=null){//如果存在out.write("你上一次访问的时间是:");for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];//获取cookie的名字if (cookie.getName().equals("lastlogintime")){//获取cookie中的值long lastlogintime = Long.parseLong(cookie.getValue());Date date = new Date(lastlogintime);out.write(date.toLocaleString());}}}else{out.write("这是你第一次访问本站!");}//服务器给客户端发一个cookieCookie cookie = new Cookie("lastlogintime", System.currentTimeMillis()+"");//有效期为1天cookie.setMaxAge(24*60*60);resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
web.xml
<servlet><servlet-name>CookieDemo01</servlet-name><servlet-class>com.zr.servlet.CookieDemo01</servlet-class>
</servlet><servlet-mapping><servlet-name>CookieDemo01</servlet-name><url-pattern>/c1</url-pattern>
</servlet-mapping>
cookie:一般会保存在本地的用户目录下appdata;
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie的大小有限制4kb
- cookie浏览器上限300个
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
Session
session:
-
服务器会给每一个用户(浏览器)创建一个session对象
-
一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
-
用户登录之后,整个网站都可以访问,-->保存用户的信息
session和cookie的区别:
- cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- session是把数据写到用户独占的session中,服务器保存(保存重要的信息,减少资源的浪费)
- session对象由服务器创建
session保存数据
package com.zr.pojo;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class SessionDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//得到sessionHttpSession session = req.getSession();//给session存东西session.setAttribute("name",new Person("周周",1));//获得session的idString id = session.getId();//判断session是不是新创建的if(session.isNew()){resp.getWriter().write("session创建成功,ID:"+ id);}else {resp.getWriter().write("session已经存在,ID:"+ id);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
public class SessionDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解决中文乱码req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//得到session的数据HttpSession session = req.getSession();Person person = (Person) session.getAttribute("name");System.out.println(person);}@Overridejavaprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
<servlet><servlet-name>SessionDemo01</servlet-name><servlet-class>com.zr.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.zr.servlet.SessionDemo02</servlet-class>
</servlet>
<servlet-mapping><servlet-name>SessionDemo02</servlet-name><url-pattern>/s2</url-pattern>
</servlet-mapping>
session手动注销
public class SessionDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.removeAttribute("name");//手动注销sessionsession.invalidate();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
JSP
什么是JSP
jsp:java server pages,Java服务器端界面,和servlet一样,用于开发动态web技术。
特点
- 写jsp就像写html
- 区别
- html只给用户提供静态的数据
- jsp页面可以嵌入Java代码,为用户提供动态数据
JavaBean
实体类
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM;
ORM对象关系映射
- 表--->类
- 字段--->属性
- 行记录--->对象

建立数据库相应的字段后创建java实体类
package com.zr.pojo;
//实体类 一般是和数据库中的表结构一一对应的
public class People {private int id;private String name;private int age;private String address;public People() {}public People(int id, String name, int age, String address) {this.id = id;this.name = name;this.age = age;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "People{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}
}
<%@ page import="com.zr.pojo.People" %><%--Created by IntelliJ IDEA.User: zrDate: 2020/10/11Time: 22:08To 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.setAddress();
// people.setId();
// people.setAge();
// people.setName();//和下面的等价
%>
<jsp:useBean id="people" class="com.zr.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="武汉"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="18"/>
<jsp:setProperty name="people" property="name" value="小周"/>姓名:<jsp:getProperty name="people" property="name"/>
id:<jsp:getProperty name="people" property="id"/>
年龄:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>
MVC三层架构
MVC:model,view,controller 模型视图控制器
Model
- 业务处理,业务逻辑(Service)
- 数据持久层,CRUD(Dao)
View
- 展示数据
- 提供操作发起Servlet请求(a,form,img ....)
Controller(Servlet)
- 接收请求,(req:请求参数,session信息...)
- 交给业务层处理相应的代码
- 控制视图的跳转
工作流程:
1.浏览器通过视图向控制器发出请求;
2.控制器接收到请求后对数据进行封装,选择模型进行业务逻辑处理;
3.随后控制器将模型处理结果转发到视图或下一个控制器;
4.在视图层合并数据和界面模板生成HTML并做出最终响应。
过滤器
Filter:过滤器,用来过滤网站的数据:
- 处理中文乱码
- 登录验证...
Filter
功能:
1、⽤来拦截传⼊的请求和传出的响应。
2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。
如何使⽤?
与使⽤ Servlet 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝
即可。
Filter 的⽣命周期
当 Tomcat 启动时,通过反射机制调⽤ Filter 的⽆参构造函数创建实例化对象,同时调⽤ init ⽅法实现
初始化,doFilter ⽅法调⽤多次,当 Tomcat 服务关闭的时候,调⽤ destory 来销毁 Filter 对象。
⽆参构造函数:只调⽤⼀次,当 Tomcat 启动时调⽤(Filter ⼀定要进⾏配置)
init ⽅法:只调⽤⼀次,当 Filter 的实例化对象创建完成之后调⽤
doFilter:调⽤多次,访问 Filter 的业务逻辑都写在 Filter 中
destory:只调⽤⼀次,Tomcat 关闭时调⽤。
同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调
⽤,因为 web.xml 是从上到下顺序读取的。
实际开发中 Filter 的使⽤场景:
1、统⼀处理中⽂乱码。
2、屏蔽敏感词。
监听器
监听器GUI编程中经常使用
JDBC
Java连接数据库,导入JDBC依赖mysql-connector-java,IDEA中连接数据库
public class TestJdbc {public static void main(String[] args) throws ClassNotFoundException, SQLException {//配置信息String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8";String username = "root";String password = "123456";//加载驱动Class.forName("com.mysql.jdbc.Driver");//连接数据库Connection connection = DriverManager.getConnection(url, username, password);//向数据库发送sql的对象Statement statement = connection.createStatement();//编写sqlString sql = "select * from users";//执行查询sql,返回一个结果集ResultSet rs = statement.executeQuery(sql);while (rs.next()){System.out.println("id="+rs.getObject("id"));System.out.println("name="+rs.getObject("name"));System.out.println("password="+rs.getObject("password"));System.out.println("email="+rs.getObject("email"));System.out.println("birthday="+rs.getObject("birthday"));}//关闭连接rs.close();statement.close();connection.commit();}
}
预编译sql
Junit单元测试
依赖
<!--单元测试-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
简单使用
@Test注解只在方法上有效,只要加了这个注解的方法,就可以直接运行.
public class TestJdbc3 {@Testpublic void test(){System.out.println("Hello");}
}
转账事务(创建account表,字段id,name,money),使用单元测试
public class TestJdbc3 {@Testpublic void test() {//配置信息String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8";String username = "root";String password = "123456";Connection connection=null;//加载驱动try {Class.forName("com.mysql.jdbc.Driver");//连接数据库connection = DriverManager.getConnection(url, username, password);//通知数据库开启事务connection.setAutoCommit(false);String sql1 = "update account set money=money-100 where name='A'";connection.prepareStatement(sql1).executeUpdate();//制造错误int i=1/0;String sql2 = "update account set money=money+100 where name='B'";connection.prepareStatement(sql2).executeUpdate();connection.commit();//以上sql都执行成功才提交System.out.println("提交成功!");} catch (Exception e) {try {//如果出现异常,就回滚事务connection.rollback();System.out.println("转账失败!");} catch (SQLException throwables) {throwables.printStackTrace();}e.printStackTrace();}finally {try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}
}
相关文章:
JavaWeb知识梳理(后端部分)
JavaWeb 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。 静态web资源开发技术࿱…...
AI:07-基于卷积神经网络的海洋生物的识别
当涉及海洋生物的识别和研究时,基于深度学习的方法已经展现出了巨大的潜力。深度学习模型可以利用大量的图像和标记数据来自动学习特征,并实现高准确度的分类任务。本文将介绍如何使用深度学习技术来实现海洋生物的自动识别,并提供相应的代码示例。 数据收集和预处理 要训…...
centos7下docker设置新的下载镜像源并调整存放docker下载镜像的仓库位置
目录 1.设置镜像源 2.调整存放下载镜像的仓库位置 1.设置镜像源 在 /etc/docker下创建一个daemon.json文件。在json中下入 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"] 完成配置 加载配置 systemctl daemon-reload 重启docker sy…...
Gitea--私有git服务器搭建详细教程
一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来,gitea的创作团队重新fork了代码,并命名为giteagitea 功能特性多,能够满足我们所有的的代码管理需…...
SOLIDWORKS放样是什么意思?
SOLIDWORKS是一款广受欢迎的三维计算机辅助设计(CAD)软件,提供了许多强大的功能来帮助工程师实现他们的创意。其中一个重要的功能是放样功能,它在设计过程中起着至关重要的作用。本文将介绍SOLIDWORKS放样的概念、特点和应用。 放…...
Xcode打包ipa文件,查看app包内文件
1、Xcode发布ipa文件前,在info中打开如下两个选项,即可在手机上查看app包名文件夹下的文件及数据。...
AJAX学习笔记6 JQuery对AJAX进行封装
AJAX学习笔记5同步与异步理解_biubiubiu0706的博客-CSDN博客 AJAX请求相关的代码都是类似的,有很多重复的代码,这些重复的代码能不能不写,能不能封装一个工具类。要发送ajax请求的话,就直接调用这个工具类中的相关函数即可。 用J…...
阿里云服务器退款规则_退款政策全解析
阿里云退款政策全解析,阿里云退款分为五天无理由全额退和非全额退订两种,阿里云百科以云服务器为例,阿里云服务器包年包月支持五天无理由全额退订,可申请无理由全额退款,如果是按量付费的云服务器直接释放资源即可。阿…...
ExpressLRS开源之基本调试数据含义
ExpressLRS开源之基本调试数据含义 1. 源由2. 代码2.1 debugRcvrLinkstats2.2 debugRcvrSignalStats 3. 含义解释3.1 ID(packetCounter),Antenna,RSSI(dBm),LQ,SNR,PWR,FHSS,TimingOffset3.2 IRQ_CNT,RSSI_AVE,SNR_AVE,SNV_MAX,TELEM_CNT,FAIL_CNT 4. 总结5. 参考资料 1. 源由 …...
DOM 简介 | 深入了解DOM
目录 一、DOM是什么 二、DOM的访问 三、DOM节点类型 四、DOM的分级 今天我们将了解WEB编程中一个重要的概念DOM(Document Object Model)文档对象模型,它帮助我们使用JavaScript(或其他编程语言)操纵文档。 一、DO…...
机器学习丨2. 线性回归(Linear Regression)
Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…...
python+django企业员工考勤打卡信息管理系统66lgr
本员工信息管理系统以Django作为框架,Python语言,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:员工、部门、员工合同、考勤信息、打卡信息、员工工资等模块。 本文着重阐述了员工信息管理系统的分析、设计与实现&…...
【Java Web】论坛帖子添加评论
数据层 增加评论数据;修改帖子评论数量; 业务层 处理添加评论的业务;先增加评论、在更新帖子的评论数量; 表现层 处理添加评论数据的请求;设置添加评论的表单。 一、数据层 1.1 CommentMapper.java package com.no…...
如何建设一个安全运营中心(SOC)?
然信息安全管理问题主要是个从上而下的问题,不能指望通过某一种工具来解决,但良好的安全技术基础架构能有效的推动和保障信息安全管理。随着国内行业IT应用度和信息安全管理水平的不断提高,企业对于安全管理的配套设施如安全运营中心…...
如何以Base64形式存储、返回图片数据
在Java中,可以使用Base64类来将图片转换为Base64编码。下面是一个示例代码: Java代码直接处理: import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Base64; public class ImageToBase64…...
【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对
自动化问答生成:使用GPT-3.5将文档转化为问答对 正文步骤1:准备工作步骤2:编写Python脚本 总结 当我们需要将大段文档转化为问答对时,OpenAI的GPT-3.5模型提供了一个强大的工具。这个教程将向您展示如何编写一个Python脚本&#x…...
普通平衡树 Splay
Splay 简介 Splay(伸展树),又叫做分裂树,是一种自调整形式的二叉查找树,满足二叉查找树的性质:一个节点左子树的所有节点的权值,均小于这个节点的权值。且其右子树所有节点的权值,均…...
复旦-华盛顿EMBA:走近亿咖通科技,探寻汽车智能化的科创“密码”
6月20日,应复旦大学-华盛顿大学EMBA项目18班校友周靖的邀请,项目校友参访了科创企业ECARX亿咖通科技。作为该公司资深副总裁、中国首席财务官,周靖带领大家通过产品演示、实车驾驶和交流对话探寻汽车智能化的科创“密码”,近距离感…...
学习心得07:C#
之前也没有看过C#的书,C#的程序倒是搞了一些。好在项目不大,我又会套路。 C#很象是JAVA。好像就是JAVA出来之后,微软抄的。好东西就要学习,这不丢脸。 我倒是想,有没有办法把JAVA和C#进行映射,然后直接编译…...
importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图
一 drf之请求响应回顾 # 1 drf请求-请求对象:data,query_params,其他跟之前一样,FILES-默认:支持三种编码-局部配置:视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
