html,css 提供给所有人看的数据始终不会变化
动态web提供给所有人看,会发生变化的,每个人在不同的时间,不同的地点看到的信息是不同的;例如淘宝;技术栈包括servlet、jsp、asp、php
优点:
web页面可以动态更新,所有用户看到都不是同一个页面
可以与数据库交互(数据持久化)
php开发速度很快,功能很强大,跨平台,代码简单
无法承载大访问量的情况(局限性)
sun公司主推的BS架构,基于java语言开发,可以承载三高问题带来的影响
BS架构浏览器和服务器
CS架构客户端和服务器
web服务器服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
Tomcat免费开源的一款轻量级应用服务器,在小型系统和并发用户不多的场合下使用度高,可以运行JSP页面和Servlet
Http详解HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上
文本:html、字符串。。。
超文本:图片、音乐、定位、视频、地图。。。
客户端—发请求(Request)—服务器
Request URL:https://www.baidu.com/ 请求地址 Request Method:GET get方法、post方法 Status Code:200 OK 状态码200 Remote Address:14.215.177.39:443 远程地址请求行
请求行中的请求方式:GET
请求方式:Get、Post。。。
请求能够携带的参数较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但是高效
post请求请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但是不高效
消息头Accept:告诉浏览器,它锁支持的数据类型 Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 Accept-Language:告诉浏览器,语言环境 Cache-Control:缓存控制 Connection:告诉浏览器,请求完成是断开还是保持连接Http响应
服务器—响应----客户端
Cache-Control:private 缓存控制 Connection:keep-alive 连接 Content-Encoding:gzip 编码 Content-Type:text/html;charset=utf-8 类型响应体
Accept:告诉浏览器,它锁支持的数据类型 Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 Accept-Language:告诉浏览器,语言环境 Cache-Control:缓存控制 Connection:告诉浏览器,请求完成是断开还是保持连接 Host:主机 refrush:告诉客户端,多久刷新一次 Location:让网页重新定位响应状态码
200:请求响应成功
3**:请求重定向,重新到另一个指定的路径
4**:找不到资源
5**:服务器代码错误
pom依赖
javax.servlet javax.servlet-api 4.0.1 javax.servlet.jsp javax.servlet.jsp-api 2.3.3
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 响应的类型:html
resp.setContentType("text/html");
// 获取响应的输出流
PrintWriter writer = resp.getWriter();
writer.println("");
writer.println("");
writer.println("hello hupf ");
writer.println("");
writer.println("");
writer.println("hello hupf");
writer.println("");
writer.println("");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
web.xml
Archetype Created Web Application helloServlet com.hupf.servlet.HelloServlet helloServlet /hello
servlet接口sun公司有两个默认的实现类:HttpServlet,GenericServlet
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需给他一个浏览器能够访问的路径
Servlet原理Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会调用servlet,调用service方法,将响应返回给servlet、客户端
Mapping- 一个servlet可以指定一个映射路径
helloServlet com.hupf.servlet.HelloServlet helloServlet /hello
- 一个servlet可以指定多个映射路径
helloServlet com.hupf.servlet.HelloServlet helloServlet /hello1 helloServlet /hello2
- 一个servlet可以指定通用映射路径
helloServlet /hello/*
- 默认请求路径
helloServlet /*
- 指定一些后缀或前缀等等
helloServlet *.do
- 优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
ServletContext对象error com.kuang.servlet.ErroeServlet error /*
全局参数配置和servlet初始化参数配置:
error com.kuang.servlet.ErroeServlet error /*
ServletContect对象
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContect对象,他代表了当前的web应用:
-
共享数据
我在这个servlet中保存的数据,可以在另外一个servlet中拿到示例代码:
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletcontext对象
ServletContext servletContext = this.getServletContext();
// 设置属性值
servletContext.setAttribute("name","hupf");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletcontext对象
ServletContext servletContext = this.getServletContext();
// 获取属性值
String name = servletContext.getAttribute("name").toString();
resp.getWriter().println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
在web.xml中配置完servlet映射,先访HelloServlet,再访问servlet1,输出:
hupf
- 获取初始化参数
URL www.baidu.com
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletcontext对象
ServletContext servletContext = this.getServletContext();
// 获取属性值
String url = servletContext.getAttribute("URL").toString();
resp.getWriter().println(url);
}
请求转发
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletcontext对象
ServletContext servletContext = this.getServletContext();
// 请求转发
servletContext.getRequestDispatcher("/hello").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
转发:客户端请求服务器,服务器说你请求的这个servlet不能解决问题,我的另一个servlet能解决你的问题,我安排他给你解决
重定向:客户端请求服务器,服务器说你的这个请求处理不了,我给你介绍一个servlet,他能解决你的请求,给你地址你去找它
读取资源文件
properties
- 在java目录下新建properties
- 在resource目录下新建properties
发现:都被打包到了同一路径下:classes,我们俗称这个路径是classpath
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
properties.getProperty("username");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
负责向浏览器发送数据的方法
servletOutputStream getOutputStream() throws IOExecption; 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);
下载文件
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 要获取下载文件的路径
String realPath = this.getServletContext().getRealPath("1.png");
// 下载文件的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\") + 1);
// 设置让浏览器能够支持下载我们需要的东西
resp.setHeader("Content-Disposition","attachment;ilename="+fileName);
// 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 将FileOutputStream流写入到buffer缓冲区,使用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);
}
}
验证码实现
public class HelloServlet 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 = image.getGraphics();
// 设置图片的背景颜色
g.setColor(Color.WHITE);
g.fillRect(0,0,80,20);
// 给图片写数据
g.setColor(Color.BLUE);
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");
// 把图片写到浏览器
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");
}
return sb.toString();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
HttpServletRequest


