Servlet就是sun公司开发动态web的一门技术
Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
(1)Maven父子工程
构建一个普通的maven项目,删除掉里面的src目录,以后我们的学习就在这个项目里面创建Moudel,这个空的工程就是Maven的主工程
(2)关于Maven父子工程的理解:
父项目中会有一个moudle:
<modules>
<module>JavaWeb_01_mavenmodule>
modules>
子项目中会有:
<parent>
<artifactId>JavaWeb_ParentsartifactId>
<groupId>org.examplegroupId>
<version>1.0-SNAPSHOTversion>
parent>
父项目中所有jar包配置的java子项目可以直接使用:相当于java的继承多态特性
son extends father
(3)Maven环境优化
修改web.xml为最新的
将maven的结构搭建完整
(4)编写一个Servlet
HTTPServlet----GenericServlet----Servlet
void init(ServletConfig var1) throws ServletException; //初始化
ServletConfig getServletConfig();//获取Servlet配置
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();//获取信息
void destroy();//注销
编写一个普通类
实现Servlet几口,这里我们直接继承HttpServlet
package com.LearnMaven.servlet;
import javax.servlet.ServletException;
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 {
//由于ge和post知识请求实现的不同方式,可以相互调用业务逻辑
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello.serlver");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
(5)编写Servlet的映射
为什么需要映射?
我们写的Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给它一个访问的路径。
<servlet>
<servlet-name>helloServletservlet-name>
<servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
(6)配置Tomcat
注意:配置项目的发布路径就可以了
(7)启动测试,OK
Servlet是有Web服务器调用,web服务器在收到浏览器
请求之后会:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2upvFxt-1631325712337)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210708204804381.png)]
1、一个Servlet可以指定一个映射路径
<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>helloServletservlet-name>
<servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
2、一个Servlet可以指定多个映射路径
<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>helloServletservlet-name>
<servlet-class>com.LearnMaven.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hello2url-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hello3url-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hello4url-pattern>
servlet-mapping>
web-app>
3、一个Servlet可以指定通用映射路径
<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>helloServletservlet-name> <servlet-class>com.LearnMaven.servlet.HelloServletservlet-class> servlet> <servlet-mapping> <servlet-name>helloServletservlet-name> <url-pattern>/hellourl-pattern> servlet-mapping> <servlet-mapping> <servlet-name>helloServletservlet-name> <url-pattern>/*url-pattern> servlet-mapping>web-app>
4、默认请求路径
<servlet-mapping> <servlet-name>helloServletservlet-name> <url-pattern>/*url-pattern> servlet-mapping>
5、指定一些后缀或者前缀等等……
<servlet-mapping> <servlet-name>helloServlet servlet-name> <url-pattern>*.docurl-pattern> servlet-mapping>
6、优先级问题
制定了固有的映射路径优先级最高,如果找不到就走默认的请求。
<servlet-mapping> <servlet-name>errorServletservlet-name> <url-pattern>/*url-pattern> servlet-mapping>
Web容器在启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用:
package com.LearnMaven.Servlet1;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("hello,world!");
ServletContext context = this.getServletContext();
String username="青江";
context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为“username" 值为username
}
package com.LearnMaven.Servlet1;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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 GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = getServletContext();
String username=(String)context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("姓名:"+username);
}
<servlet>
<servlet-name>helloServlet1servlet-name>
<servlet-class>com.LearnMaven.Servlet1.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServlet1servlet-name>
<url-pattern>/hello1url-pattern>
servlet-mapping>
<servlet>
<servlet-name>getServletservlet-name>
<servlet-class>com.LearnMaven.Servlet1.GetServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>getServletservlet-name>
<url-pattern>/getservleturl-pattern>
servlet-mapping>
xml配置
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/learnparam-value>
context-param>
package com.LearnMaven.Servlet1;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().write(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
context.getRequestDispatcher("/demo01").forward(req,resp);
}
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 setBufferSize(int var1);
void sendError(int var1, String var2) throws IOException;
void sendError(int var1) throws IOException;
void sendRedirect(String var1) throws IOException;
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);
1、要获取下载文件的路径
2、下载的文件名是啥
3、设置想办法让六七能够支持下载我们需要的东西
4、获取下载路径
5、创建缓冲区
6、获取OutputStream对象
7、将FileOutputStream 流写到buffer缓冲区
8、使用OutputStream缓冲区中的数据输出到客户端
文件下载案列:
package com.learn.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、要获取下载文件的路径
String realPath="D:\\资料\\JavaWeb\\JavaWeb_Parents\\Response\\src\\main\\resources\\捕获.JPG";
// 2、下载的文件名是啥
String filename=realPath.substring(realPath.lastIndexOf("\\")+1);
// 3、设置想办法让浏览器能够支持下载我们需要的东西
resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename, "UTF-8"));
// 4、获取下载路径
FileInputStream in = new FileInputStream(realPath);
// 5、创建缓冲区
int len=0;
byte[] buffer=new byte[1024];
// 6、获取OutputStream对象
ServletOutputStream out=resp.getOutputStream();
// 7、将FileOutputStream 流写到buffer缓冲区
// 8、使用OutputStream缓冲区中的数据输出到客户端
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
验证码怎么实现?
前端实现
后端实现,需要用到一个Java图片类,生产一个图片
package com.learn.servlet;
import com.sun.org.apache.xpath.internal.operations.Gt;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
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;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器3秒自动刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics g=(Graphics)image.getGraphics();//笔
//设置图片的背景颜色
g.setColor(Color.white);
g.setFont(new Font(null,Font.BOLD,20));
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.BLUE);
g.fillRect(0,0,80,20);
g.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(999999)+"";
StringBuffer sb=new StringBuffer();
for(int i=0;i<7-num.length();i++){
sb.append("0");
}
num=sb.toString()+num;
return num;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTYqjB1J-1631325712339)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210709200518850.png)]
B一个web资源受到客户端A的请求后,B他会通知A客户端去访问另外一个web资源,这个过程叫重定向
常年场景:
用户登录
void sendRedirect(String varl)throws IOException;
测试:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setHeader("Location","/re");
resp.setStatus(302);
*/
resp.sendRedirect("/re");//重定向
}
面试题:请你聊聊重定向和转发的区别?
相同点:
不同点:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
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));
System.out.println("===============================");
//通过请求转发
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
面试题:请你聊聊重定向和转发的区别?
相同点:
不同点:
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话
**有状态会话:**一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话。
你怎么能证明你是西开的学生?
你 西开
一个网站,怎么证明你来过?
客户端 服务端
1、一个服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了:cookie
2、服务器已经登记你来过了,下次你来的时候我来匹配你:session
cookie:
session:
1、从会话中拿到cookie信息
2、服务器响应给客户端cookie
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZBSDuA9-1631325712341)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210711173205161.png)]
//Cookie,服务器端从客户端获取
Cookie[] cookies = req.getCookies();//这里犯规数据,说明cookie可能存在的多个
cookie.getName();//获得cookie中key
cookie.getValue();//新建一个cookie中的value
new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下appdata;
一个网站cookie是否存在上限!聊聊细节问题:
一个cookie只能保存一个信息;
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
Cookie大小有限制:4kb;
300个cookie浏览器上限;
删除Cookie:
不设置有效期,关闭浏览器,自动失效;
设置有效时间为0;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie,名字必须要和要删除的名字一致
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
//将Cookie有效期设置为0,立马过期
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
编码解码:(可以有效解决网页的乱码问题)
URLEncoder.encode("秦疆","utf-8");//编码
URLDecoder.decode(cookie.getValue(),"utf-8");//解码
什么是Session:
Session和cookie的区别:
使用场景:
使用Session:
package com.learn.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class SessionDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
req.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("JSESSION", id);
// resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
//获取Session值
HttpSession session = req.getSession();
String name=(String)session.getAttribute("name");
resp.getWriter().write("姓名:"+name);
//获取Session值
HttpSession session = req.getSession();
//删除Session中的name
session.removeAttribute("name");
//注销Session
session.invalidate();
会话自动过期
<session-config>
<session-timeout>1session-timeout>
session-config>
Java Server Page:Java服务器端页面,也和Servlet一样,用于动态Web技术
最大特点:
思路:JSP到低怎么执行的!
浏览器像服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换为Java类
JSP本质上就是一个Servlet
//初始化
public void _jspInit(){
}
//销毁
public void _jspDestroy(){
}
//JSPService
public void _jspService(HttpServletRequest request,HttpServletResqonse response)
1、判断请求
2、内置一些对象
final javax.servlet.jsp.PageCOntext pageContext; //页面上下文
javax.servlet.http.HttpSession session=null; //session
final javax.servlet.ServletContext applicateion; //applicationContext
final javax.servler.ServletConfig config; //config
javax.servlet.jsp.JspWriter out=null; //out
final java.lang.Object page=this; //page:当前
HTTPServletRequest request; //请求
HttpServletRespose response //响应
3、输出页面前增加的代码
4、这些内置对象我们可以直接在JSP页面中使用!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xeOOIlUZ-1631325712344)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712095301387.png)]
在JSP中,只要是JAVA代码就会原封不同的输出
如果是HTML代码,就会转化为如下格式的数据
out.write("\r\n");
任何语言都有自己的语法,Java中有,JSP作为Java技术的一种应用,它拥有一些自己扩充的语法(了解:知道即可),Java所有语法都支持!
JSP表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
JSP脚本片段
<%--脚本片段--%>
<%
int sum=0;
for(int i=0;i<=100;i++){
sum+=i;
}
out.println("Sum="+sum+"
");
%>
<hr>
<%
int x=10;
out.println(x);
%>
<p>这是一个JSP文档</p>
<%
int y=2;
out.print(y);
%>
<hr>
<%
for (int i=0;i<5;i++){
%>
<h1>hello word! <%= i%></h1>
<%
}
%>
JSP声明
<%!
static{
System.out.println("Loading Servlet");
}
private int globalvar=0;
public void kuang(){
System.out.println("进入了方法kuang!");
}
%>
JSP 声明:会被编译到JSP生成java的类中,其他的就会生成到jspService方法中!
在JSP,嵌入Java代码即可!
<%%> 普通JSP语法
<%=%> 取值
<%!%> 声明
<%-- 注释 --%>
JSP的注释。不会在客户端显示,HTML就会!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--显示的声明这是一个错误的页面--%>
<%@page isErrorPage="false" %>
<%--内置对象--%>
<%
pageContext.setAttribute("name1","秦疆1");//保存的数据值在一个页面中有效
request.setAttribute("name2","秦疆2");//保存的数据只在一个请求中有效,请求转发会携带这个数据
session.setAttribute("name3","秦疆3");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","秦疆");//保存的数据只在服务器中有效,从打开服务到关闭服务器
%>
<%--脚本中的代码,会被原封不动的生成到.JSP Java
要求:这里面的代码:必须保证java语法的正确性
--%>
<%
//从pageContext取出,我们通过寻找的方式来
//从底层到高层(作用域):
//双亲委派机制
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表达式输出--%>
取出的值为:
${name1}
${name2}
${name3}
${name4}
request:客户端向服务器发送请求,产生的数据,用户看完就没用额,比如:新闻,用户看完就没用的!
Session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,购物车
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如聊天数据
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.3.3version>
dependency>
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
dependencies>
EL表达式:${}
JS标签
<%--jsp:include--%>
<%--
http://localhost:8080/jsptag.jsp?name=kuangsheng&age=12
--%>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义了许多标签,可以供我们使用,标签的功能和java代码一样。
核心标签(掌握部分)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXMx0FM6-1631325712345)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712202903294.png)]
JSTL标签库使用步骤
格式化标签
SQL标签
XML标签
实体类
JavaBean有特有的写法:
一般用来和数据库的字段做封装
什么是MVC:Model、View、Controller、模型、视图、控制器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wk9KFCEP-1631325712347)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712225756409.png)]
用户直接访问控制层,控制层就可以直接操作数据库
Servlet--CURD--数据库
弊端:程序十分臃肿,不利于维护
Servlet的代码中:出路请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
架构:没有什么是加一层解决不了的
JDBC
MySQL Orale SQLServlet……
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZDetOCi-1631325712348)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210712230740691.png)]
Model
View
Controller
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username,password)--->交给业务层处理登录业务(判断用户名密码是否正确:事物)-->Dao层查询用户名和密码是否正确-->数据库
Filler:过滤器,用来过滤网站的数据;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESQMt7aS-1631325712348)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713125143464.png)]
filter过滤步骤:
1、导包
2、编写过滤器
导包不要导错了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qr1uiYJE-1631325712349)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713142537175.png)]
实现Filter接口,重写对应的方法即可
package com.learn.Filler;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就已经初始化,随时等待过滤对出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFiller初始化");
}
//Chain:链
/*
1、过滤中的所有代码,在过滤特定定请求的时候都会执行
2、必须要让过滤继续通行
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFiller执行前……");
filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序将在这停止!
System.out.println("CharacterEncodingFiller执行后……");
}
//销毁:web服务器关闭额时候,过滤器会销毁
public void destroy() {
System.out.println("CharacterEncodingFiller销毁");
}
}
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>com.learn.Filler.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/servlet/*url-pattern>
filter-mapping>
实现一个监听器的接口:(有N种)
1、编写一个监听器
实现监听器接口
package com.learn.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数:统计Session
public class OnlineCountListener implements HttpSessionListener {
//创建session的监听
//一旦创建一个session就会触发一次这个事件
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
ServletContext Context = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer) Context.getAttribute("OnlinCount");
if(onlineCount==null){
onlineCount=new Integer(1);
}else{
int count=onlineCount.intValue();
onlineCount=new Integer(count+1);
}
Context.setAttribute("OnlinCount",onlineCount);
}
//销毁Session的监听
//一旦销毁Session就会触发一次这个事件
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext Context = httpSessionEvent.getSession().getServletContext();
httpSessionEvent.getSession().invalidate();
Integer onlineCount = (Integer) Context.getAttribute("OnlinCount");
if(onlineCount==null){
onlineCount=new Integer(1);
}else{
int count=onlineCount.intValue();
onlineCount=new Integer(count-1);
}
Context.setAttribute("OnlinCount",onlineCount);
}
}
2、注册监听器
<listener>
<listener-class>com.learn.listener.OnlineCountListenerlistener-class>
listener>
3、看情况是否使用
监听器:GUI编程中经常使用;
用户登录之后才能进入首页,用户注销后不能进入首页了!
1、用户登录之后,向Session中放入用户 的数据
2、进入主页的时候要判断用户是否已经登录:要求:在过滤器中实现!
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
Object id = req.getSession().getAttribute("USER_SESSION");
if (id==null){
resp.sendRedirect("/JavaWeb_Filler_war/error/error.jsp");
}
filterChain.doFilter(req,resp);
}
什么是JDBC:Java连接数据库!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCnSMTog-1631325712350)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210713221917119.png)]
需要jar包的支持:
java.sql
javax.sql
mysql-conner-java……连接驱动(必须要导入的)
实验环境搭建:
JDBC固定步骤:
1、加载驱动
2、连接数据库,代表数据库
3、向数据库发送SQL的对象Statement:CRUD
4、编写SQL(根据业务,不同的SQL)
5、执行SQL
6、关闭连接
要么都成功,要么都失败
ACID原则:保证数据的安全。
开启事物
事物提交 commit()
事物回滚 rollback()
关闭事物
转账
A:1000
B:1000
A(900) ----100---》 B(1100)
依赖
简单使用
@Test注解只有在放上有效,只要加了这个注解的方法,就可以直接运行!
@Test
public void test(){
System.out.println("Hello!");
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mr3JtWLt-1631325712352)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210714091012865.png)]
失败的时候是红色的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kguOukbQ-1631325712353)(C:\Users\明艳\AppData\Roaming\Typora\typora-user-images\image-20210714091129849.png)]
``xml-dtd
com.learn.listener.OnlineCountListener
3、看情况是否使用
# (八)过滤器、监听器常见应用
监听器:GUI编程中经常使用;
用户登录之后才能进入首页,用户注销后不能进入首页了!
1、用户登录之后,向Session中放入用户 的数据
2、进入主页的时候要判断用户是否已经登录:要求:在过滤器中实现!
```java
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
Object id = req.getSession().getAttribute("USER_SESSION");
if (id==null){
resp.sendRedirect("/JavaWeb_Filler_war/error/error.jsp");
}
filterChain.doFilter(req,resp);
}
什么是JDBC:Java连接数据库!
[外链图片转存中…(img-OCnSMTog-1631325712350)]
需要jar包的支持:
java.sql
javax.sql
mysql-conner-java……连接驱动(必须要导入的)
实验环境搭建:
JDBC固定步骤:
1、加载驱动
2、连接数据库,代表数据库
3、向数据库发送SQL的对象Statement:CRUD
4、编写SQL(根据业务,不同的SQL)
5、执行SQL
6、关闭连接
要么都成功,要么都失败
ACID原则:保证数据的安全。
开启事物
事物提交 commit()
事物回滚 rollback()
关闭事物
转账
A:1000
B:1000
A(900) ----100---》 B(1100)
依赖
简单使用
@Test注解只有在放上有效,只要加了这个注解的方法,就可以直接运行!
@Test
public void test(){
System.out.println("Hello!");
}
[外链图片转存中…(img-Mr3JtWLt-1631325712352)]
失败的时候是红色的:
[外链图片转存中…(img-kguOukbQ-1631325712353)]