web:网页
静态web:html,css 数据不会发生变化
动态web:servlet/jsp,asp,php每个人在不同的时间看到数据都不同
web应用程序编写完毕后,若想提供给外界访问,就需要一个服务器统一管理
静态web的缺点:
技术
asp:
php:
jsp/servlet:
服务器
用来处理请求和给用户一些响应信息。
lls:微软的
tomcat:Apache的,给初学者很友好。
文件夹作用

bin目录下的startup启动tomcat

超文本传输协议,是一个简单的请求响应协议,运行在tcp之上。
https:安全的连接
两个时代
http1.0
http2.0
请求响应
在javaweb中需要使用大量的jar包,我们手动去导入。由此maven诞生了。
它是一个项目架构管理工具。
1.下载安装,直接在官网下载即可
2.配置环境变量

3.配置镜像,可以提升下载jar包速度,在conf配置文件中的setting文件中配置
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
4.在setting中配置本地仓库
<localRepository>E:\browserDownloads\apache-maven-3.8.5\maven-repolocalRepository>
创建maven项目在idea中

sun公司提供两种实现类:
1.实现servlet接口
2.继承Httpservlet
把实现了servlet接口的程序叫做servlet
创建一个helloservlet
导入maven依赖:
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.3.2-b01version>
dependency>
dependencies>
敲一个servlet
package com.javaweb;
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;
/**
* @author panglili
* @create 2022-07-19-8:18
*/
public class HelloServlet extends HttpServlet {
//由于get和post只是请求的方式不一样,因此只需要实现一个,在另一个里面调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("******doget");
PrintWriter writer = resp.getWriter();
writer.print("hello,servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册在web上
<servlet>
<servlet-name>helloservlet-name>
<servlet-class>com.javaweb.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloservlet-name>
<url-pattern>/addurl-pattern>
servlet-mapping>
web容器在启动的时候,会为每个web程序都创建一个servletcontext对象,代表当前web应用。全局唯一!

测试一下:
(1)创建一个servlet使用context设置属性
package com.javaweb.servlet;
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;
/**
* @author panglili
* @create 2022-07-19-8:18
*/
public class HelloServlet extends HttpServlet {
//由于get和post只是请求的方式不一样,因此只需要实现一个,在另一个里面调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username="ssss";
context.setAttribute("username",username);
System.out.println("******doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
(2)创建另一个servlet使用context获取属性值
package com.javaweb.servlet;
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;
/**
* @author panglili
* @create 2022-07-19-16:28
*/
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);
}
}
(3)然后配置servlet在web中就可以在网页访问了
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.javaweb.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.javaweb.servlet.getServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
(4)在网页请求getc可以拿到hello的属性值

(1)web初始化数据
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/mybatisparam-value>
context-param>
(2)servlet中获取
package com.javaweb.servlet;
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;
/**
* @author panglili
* @create 2022-07-19-17:02
*/
public class ServletDemo extends HttpServlet {
//由于get和post只是请求的方式不一样,因此只需要实现一个,在另一个里面调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
System.out.println("******doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
(3)网页数据

(1)写请求转发的servlet
此请求被转发到getIni
package com.javaweb.servlet;
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;
/**
* @author panglili
* @create 2022-07-19-17:02
*/
public class ServletDemo2 extends HttpServlet {
//由于get和post只是请求的方式不一样,因此只需要实现一个,在另一个里面调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/getIni").forward(req,resp);
System.out.println("******doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
(2)web配置
请求demo2
<servlet>
<servlet-name>demo2servlet-name>
<servlet-class>com.javaweb.servlet.ServletDemo2servlet-class>
servlet>
<servlet-mapping>
<servlet-name>demo2servlet-name>
<url-pattern>/demo2url-pattern>
servlet-mapping>
(3)网页实现
返回的是getIni数据

web服务器接受到客户端的http请求之后,针对这个请求,分别创建一个代表请求的httpServletRequest和代表响应的HttpServletResponse
文件下载
package com.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @author panglili
* @create 2022-07-19-18:17
*/
public class Response extends HelloServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取下载路径
String path="C:\\Users\\塔塔\\Pictures\\Camera Roll\\1.jpg";
//下载的文件名
String fileName = path.substring(path.lastIndexOf("\\") + 1);
//设置想办法让浏览器支持下载需要的
resp.setHeader("Content-Disposition","attachment;fileName="+fileName);
//获取下载文件的输入流
FileInputStream stream = new FileInputStream(path);
//创建缓冲区
int len=0;
byte[] buffer = new byte[1024];
//获取OutputStream
ServletOutputStream out = resp.getOutputStream();
//将文件写到buffer缓冲区
while((len=stream.read(buffer))>0){
out.write(buffer,0,len);
}
//关闭流
stream.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
验证码实现
package com.javaweb.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
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;
/**
* @author panglili
* @create 2022-07-19-18:39
*/
public class ImageServlet extends HelloServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//每三秒刷新一次
resp.setHeader("refresh","3");
//在内存创建一个图片
BufferedImage image=new BufferedImage(80,20,BufferedImage.TYPE_INT_BGR);
//得到图片
Graphics2D g=(Graphics2D)image.getGraphics();
//设置背景颜色
g.setColor(Color.red);
g.fillRect(0,0,80,20);
//给图片写数据
g.setColor(Color.BLACK);
g.setFont(new Font(null, Font.BOLD,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(9999999)+"";
StringBuffer str = new StringBuffer();
for (int i=0;i<7-num.length();i++){
str.append("0");
}
num=str.toString()+num;
return num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>imgservlet-name>
<servlet-class>com.javaweb.servlet.ImageServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>imgservlet-name>
<url-pattern>/imgurl-pattern>
servlet-mapping>
请求重定向
package com.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author panglili
* @create 2022-07-19-18:46
*/
public class Redirect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/img");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>rediservlet-name>
<servlet-class>com.javaweb.servlet.Redirectservlet-class>
servlet>
<servlet-mapping>
<servlet-name>rediservlet-name>
<url-pattern>/rediurl-pattern>
servlet-mapping>
请求redi则会请求到img请求的页面
HttpServletRequest代表 客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest中,通过它的方法就可以拿到所有的信息。
request获取前端传的数据
package com.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author panglili
* @create 2022-07-19-19:10
*/
public class Request extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("===========");
System.out.println(username);
System.out.println(pwd);
for(String s:hobbies){
System.out.println(s);
}
System.out.println("===========");
resp.sendRedirect("/success.jsp");
}
}
前端
<%--
Created by IntelliJ IDEA.
User: 塔塔
Date: 2022/7/19
Time: 16:46
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>
$END$
<form action="${pageContext.request.contextPath}/req" method="post">
<p>名字:<input type="text" name="username" value="默认初始值" maxlength="8">p>
<p>密码:<input type="password" name="pwd"> p>
<p>
性别:
<input type="radio" value="nan" name="sex">男
<input type="radio" value="nv" name="sex">女
p>
<p>
爱好:
<input type="checkbox" value="sleep" name="hobby">睡觉
<input type="checkbox" value="sport" name="hobby">运动
<input type="checkbox" value="study" name="hobby">学习
p>
<p>
下拉框
<select name="列表名称">
<option value="选项的值">印度option>
<option value="选项的值">中国option>
<option value="选项的值">朝鲜option>
<option value="选项的值">美国option>
<option value="选项的值">瑞士option>
select>
p>
<p>
下拉框
<textarea name="textarea" cols="30" rows="50">文本neirtextarea>
p>
<p>
文件域
<input type="file" name="files">
<input type="submit" value="上传" name="upload" >
p>
<p>
<input type="submit">
<input type="reset">
p>
form>
body>
html>
会话:用户打开一个浏览器,点击了很多按钮,访问多个web资源,关闭浏览器,这个过程可以称为会话。
客户端 服务端
保存客户端信息的两种方式:
package com.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* @author panglili
* @create 2022-07-19-19:39
*/
public class Cookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
javax.servlet.http.Cookie[] cookies = req.getCookies();
if(cookies!=null){
writer.write("time:");
for(int i=0;i<cookies.length;i++){
javax.servlet.http.Cookie cookie=cookies[i];
if(cookie.getName().equals("lastLoginTime")){
long lastLoginTime=Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
System.out.println("*******");
writer.write(date.getDate());
writer.write(date.toLocaleString());
}
System.out.println("$$$$$$$$");
}
}else{
writer.write("first inter");
}
javax.servlet.http.Cookie cookie1;
cookie1 = new javax.servlet.http.Cookie("lastLoginTime", System.currentTimeMillis()+"");
//cookie1.setMaxAge(24*60*60);
resp.addCookie(cookie1);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
session实现:
package com.javaweb.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author panglili
* @create 2022-07-19-20:32
*/
public class Session extends HttpServlet {
@Override
protected 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();
//给session存值,可以通过其他session获取
session.setAttribute("name","heihe");
//获取session的id
String id = session.getId();
//判断是不是第一次创建
if(session.isNew()){
resp.getWriter().write("session创建成功"+id);
}else{
resp.getWriter().write("session已经存在"+id);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>sessionservlet-name>
<servlet-class>com.javaweb.servlet.Sessionservlet-class>
servlet>
<servlet-mapping>
<servlet-name>sessionservlet-name>
<url-pattern>/sessionurl-pattern>
servlet-mapping>
<session-config>
<session-timeout>15session-timeout>
session-config>
java server page:java服务器前端页面,和servlet一样,用于动态web开发。
特点:
jsp最终会被转换成一个java类。jsp继承了一个HttpJspBase,这个类经常间接又继承了servlet,因为jsp的本质还是一个servlet。
但是通过继承使得jsp大大简化了,servlet与前端交互的语句。
·out.print(name);
out.write("success\r\n");
说到底,就相当于在后台用java语言的servlet给前端传输数据一样只不过它使用了前端化的语言使得操作更加简单,在运行的时候它本身还是转化成了java。
jsp语法
作为一个java语言的应用它支持所有的java语法,并且有许多自己的语法。
也可以用el表达式取值:${}等价于<%=%>
脚本片段:
<%
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
out.print("sum="+sum+"
");
%>
<%! static {
System.out.println("loading^");
}
public void tata(){
System.out.println("sda");
}
%>
jsp指令
错误界面定制:
<%@ page errorPage="success.jsp" %>
包含其他页面:
<%@ include file=""%>
九大内置对象
jsp标签,jstl标签,EL表达式
使用之前要先导包
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
el表达式:${ }
jsp标签
jstl标签
弥补html标签的不足,它有许多自定义的标签
导入标签头才能使用该标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
在使用标签时遇到此问题

将jar包手动复制到tomcat服务器中


成功

核心标签
使用c开头
<%--
Created by IntelliJ IDEA.
User: 塔塔
Date: 2022/7/20
Time: 10:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
Title
javaBean
一般和数据库的表映射:字段映射属性!
表people
| id | name | age |
|---|---|---|
| 1 | tata | 18 |
| 2 | meigu | 17 |
@Data
public class people{
private int id;
private String name;
private int age;
}
三层架构
model view controller
视图,模型,控制器
早期历史

model:
view:
controller:
接受用户请求:(req:请求参数,session信息)
交给业务层处理对应的代码
控制视图的跳转
有一些信息不应该被处理,要被过滤的。
1.导包
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.3.2-b01version>
dependency>
2.继承过滤器的接口
package com.javaweb.controller;
import javax.servlet.*;
import java.io.IOException;
/**
* @author panglili
* @create 2022-07-20-20:32
*/
public class FilterDemo1 implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
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("****before:");
//让请求继续执行,如果不写请求到这里就会停止
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("####after:");
}
public void destroy() {
System.out.println("destory……");
}
}
3.写一个没有处理编码的请求
package com.javaweb.servlet;
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;
/**
* @author panglili
* @create 2022-07-20-8:26
*/
public class tets extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username="弄啥嘞~";
context.setAttribute("username",username);
resp.getWriter().write(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
此时还没有配置过滤器,看看网页效果

意料之中的乱码。
4.将过滤器注册到web配置
<filter>
<filter-name>encodingfilter-name>
<filter-class>com.javaweb.controller.FilterDemo1filter-class>
filter>
<filter-mapping>
<filter-name>encodingfilter-name>
<url-pattern>/filterurl-pattern>
filter-mapping>
5.经过过滤器的处理

1.配置监听器
package com.javaweb.controller;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.io.PushbackInputStream;
/**
* @author panglili
* @create 2022-07-20-21:03
*/
public class Listener implements HttpSessionListener {
//session创建
public void sessionCreated(HttpSessionEvent hE) {
ServletContext context = hE.getSession().getServletContext();
Integer o = (Integer)context.getAttribute("onlinecount");
if(o==null){
o=new Integer(1);
}else{
int count=o.intValue();
o=new Integer(count+1);
}
context.setAttribute("o",o);
}
public void sessionDestroyed(HttpSessionEvent hE) {
ServletContext context = hE.getSession().getServletContext();
Integer o = (Integer)context.getAttribute("onlinecount");
if(o==null){
o=new Integer(1);
}else{
int count=o.intValue();
o=new Integer(count+1);
}
context.setAttribute("o",o);
}
}
2.前台实现人数统计
<%--
Created by IntelliJ IDEA.
User: 塔塔
Date: 2022/7/20
Time: 21:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
people count:<%= getServletConfig().getServletContext().getAttribute("o")%>...
3.配置web
<listener>
<listener-class>com.javaweb.controller.Listenerlistener-class>
listener>