Javaweb 服务

Cookie:

  • 会话:浏览器和服务器之间的多次请求和响应,为了实现一些功能,浏览器可能会产生多次请求和响应,多次响应加在一起就称之为浏览器和服务器之间的一次会话

  • 会话过程中产生的一些数据,可以通过会话技术(Cookie和Session保存)。

  • Cokkie:客服端会话管理技术,把要共享的数据保存到客户端,每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享

属性名

作用

是否必须

private String name;

名称

必须

private String value;

必须

private String domain;

域名

重要

private String path;

路径

重要

private int maxAge = -1;

存活时间

重要

private int version = 0;

版本号

不重要

private String comment;

描述

不重要

Cokkie 方法 :

addCookie(Cookie cookie) 向客户端添加Cookie

getCookie() 获取所有Cookie

Cokkie 的细节:

  • 数量限制:每个网站最多只能有20个Cookie,且大小不能超过4kb。所有网站的Cookie总数不能超过300个。

  • 名称限制:Cokkie的名称只能包ASCCI码表中的字母丶数字字符。不帮韩逗号丶分号丶空格,不能以$开头Cokkie的值不支持中文

  • 存活时间限制 setMaxAge()方法接受数字

负整数:当前会话有效,浏览器关闭则清除

0:立即清除。

正整数:以秒为单位设置时间

  • 访问路径限制

默认路径:取自第一次访问的资源路径前缀。只要以这个路径开头就能访问。

设置路径:setPath()方法设置指定路径

Session:

HttpSession:服务器端会话管理技术,本质也是采用客户端会话管理技术

域对象

功能

作用

ServletContext

应用域

在整个应用之间实现数据共享

ServletRequest

请求域

在当前的请求或转发之间实现数据共享

HttpSession

会话域

在当前会话范围之间实现数据共享

返回值

方法名

说明

void

setAttribute(String name,Object value)

设置共享数据

Object

get Attribute(String name)

获取共享数据

void

removeAttribute(String name)

移除共享数据

String

getId()

获取唯一标识名称

void

Invalidate()

让session立即失效

HttpSession

getSession()

获取HttpSession对象

HttpSession

getSession(bolean create)

获取HttpSession对象,未获取到的自动创建

JSP:

  • JSP是一种动态网页技术标准

  • JSP部署在服务器上,可以处理客户端发送的请求,并根据请求内容动态生成HTML XML 或其他格式的文档的Web网页,然后再响应给客户端

  • JSP 的九大隐式对象(不需要创建就可以使用) request,response,session,application,page,config(配置对象),exception(异常对象),out,pageContext(页面域对象)(pageContext最特殊,也可以获取其他八大隐式对象)

四大域对象:

域对象名称

范围

级别

备注

PageContext

页面范围

最小,只能在当前页面使用

因范围很小,开发中用的很少

ServletRequest

请求范围

一次请求或当前请求转发用

请求转发之后再次转发时请求域丢失

HttpSession

会话范围

多次请求数据共享时使用

多次请求共享数据但不同的客户端不能共享

ServletContext

应用范围

最大,整个应用都可以使用

尽量少用,如果对数据有修改需要做同步处理

  • MVC模型

M: 模型,用于封装数,封装的是数据模型!

V: 视图。拥有显示数据,动态资源用JSP页面,静态资源用HTML页面

C: 控制器。用于处理请求和响应,例如Servlet

JSTL:

  • JSTL 主要用这些标签来取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度

  • JSTL核心标签库

标签名称

功能分类

属性

作用

<标签名:if>

流程控制

核心标签库

用于条件判断

<标签名:choose>

<标签名:when>

<标签名:otherwise>

流程控制

核心标签库

用于多条件判断

<标签名:forEach>

迭代遍历

核心标签库

用于循环遍历

Filter:

filter:过滤器 (登录验证,统一编码处理,敏感字符过滤)

FilterChain介绍:

  • FilterChain是一个接口,由Servlet容器提供实现类对象,直接使用即可

  • 过滤器可以定义多个,就会组成过滤器链

  • 核心方法 :void doFilter(ServletRequest request,ServletResponse reponse)作用:放行非法

Listener:

Listener:监听器 (观察者设计模式)

  • 三个组成部分

事件源:触发事件的对象

事件:触发的动作,封装了事件源

监听器:当事件源触发事件后,可以完成功能

  • 在程序中,我们可以对:对象的创建销毁丶域对象中属性的变化.丶会话相关内容进行监听

八大监听器:

  1. ServletContextListener:用于监听ServletContext对象的创建和销毁

contextlnitialized(ServletContextEvent sce) 对象创建时执行该方法

contextDestoryed(ServletContextEvent sce) 对象销毁时执行该方法

  1. HttpSessionListener:用于监听HttpSession对象的创建和销毁

sessionCreated(HttpSessionEvent se) 对象创建时执行该方法

sessionDestoryed(HttpSessionEvent se) 对象销毁时执行该方法

  1. ServletRequestListener 用于监听ServletRequest对象的创建和销毁

requestlnitialized(ServletRequestEvent sre) 对象创建时执行该方法

requestDestoryed(ServletRequestEvent sre) 对象销毁时执行该方法

  1. ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化

attributeAdded(ServletContextAttributeEvent scae)域中添加属性时执行该方法

attributeRemoved(ServletContextAttributeEvent scae)域中移除属性时执行该方法

attributeReplaced(ServletContextAttributeEvent scae)域中替换属性时执行该方法

  1. HttpSessionAttributeListener:用于监听HttpSession会话域中属性的变化

attributeAdded(HttpSessionBindingEvent se)域中添加属性时执行该方法

attributeRemoved(HttpSessionBindingEvent se)域中移除属性时执行该方法

attributeReplaced(HttpSessionBindingEvent se)域中替换属性时执行该方法

6.ServletRequestAttributeListener:用于监听ServletRequest请求域中属性的变化

attributeAdded(ServletRequestAttributeEvent srae)域中添加属性时执行该方法

attributeRemoved(ServletRequesttAttributeEvent srae)域中移除属性时执行该方法

attributeReplaced(ServletRequestAttributeEvent srae)域中替换属性时执行该方法

7.HttpSessionBindingListener:用于感知对象和会话域绑定的监听器

valueBound(HttpSessionBindingEvent)数据添加到会话域中(绑定)时执行该方法

valueUnBound(HttpSessionBindingEvent)数据从会话域中 删除(解绑)时执行该方法

8.HttpSessionActivationListener:用于感知会话域中对象钝化和活化的监听器

sessionWillPassivate(HttpSessionEvent se)会话域中数据钝化时执行该方法

sessionDidActivate(HttpSessionEvent se)会话域中数据活化时执行该方法

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要手写一个 JavaWeb 服务器,需要掌握以下步骤: 1. 创建一个 ServerSocket 对象,指定服务器监听的端口号; 2. 在一个循环中,不断接收客户端的请求,每次接收到一个请求,就创建一个 Socket 对象与客户端进行连接; 3. 创建一个线程池,来处理客户端的请求。每当有一个客户端连接时,就将该客户端的请求交给线程池去处理; 4. 在线程池中,根据请求的 URL,读取对应的静态资源文件,并将其返回给客户端; 5. 如果请求的是动态资源,即需要执行 Java 代码生成内容的,那么就需要在服务器端编写对应的 Servlet。在处理请求时,根据 URL 匹配对应的 Servlet,并调用其相应的方法生成内容,并将其返回给客户端; 6. 在处理完客户端请求之后,需要关闭连接。 下面是一个简单的 JavaWeb 服务器的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SimpleServer { private final static int PORT = 8080; private final static String WEB_ROOT = "src/main/resources/"; public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(PORT); ExecutorService threadPool = Executors.newFixedThreadPool(10); System.out.println("Server is running at http://localhost:" + PORT); while (true) { Socket socket = serverSocket.accept(); Runnable task = () -> { try { String request = getRequest(socket.getInputStream()); String url = parseUrl(request); if (url.equals("/")) { url = "/index.html"; } String filePath = WEB_ROOT + url; File file = new File(filePath); if (file.exists() && file.isFile()) { String contentType = guessContentType(filePath); byte[] content = readFile(file); sendResponse(socket.getOutputStream(), "HTTP/1.1 200 OK", contentType, content); } else { sendResponse(socket.getOutputStream(), "HTTP/1.1 404 Not Found", "text/html", "404 Not Found".getBytes()); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }; threadPool.execute(task); } } private static String getRequest(java.io.InputStream input) throws IOException { byte[] buffer = new byte[1024]; int len = input.read(buffer); return new String(buffer, 0, len); } private static String parseUrl(String request) { int index1, index2; index1 = request.indexOf(' '); if (index1 != -1) { index2 = request.indexOf(' ', index1 + 1); if (index2 > index1) { return request.substring(index1 + 1, index2); } } return null; } private static byte[] readFile(File file) throws IOException { try (FileInputStream fis = new FileInputStream(file)) { byte[] buffer = new byte[fis.available()]; fis.read(buffer); return buffer; } } private static String guessContentType(String fileName) { if (fileName.endsWith(".html") || fileName.endsWith(".htm")) { return "text/html"; } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) { return "image/jpeg"; } else if (fileName.endsWith(".gif")) { return "image/gif"; } else if (fileName.endsWith(".png")) { return "image/png"; } else if (fileName.endsWith(".css")) { return "text/css"; } else if (fileName.endsWith(".js")) { return "application/javascript"; } else { return "application/octet-stream"; } } private static void sendResponse(OutputStream output, String status, String contentType, byte[] content) throws IOException { output.write((status + "\r\n").getBytes()); output.write(("Content-Type: " + contentType + "\r\n").getBytes()); output.write(("Content-Length: " + content.length + "\r\n").getBytes()); output.write("\r\n".getBytes()); output.write(content); output.flush(); } private static void sendResponse(OutputStream output, String status, String contentType, String content) throws IOException { sendResponse(output, status, contentType, content.getBytes()); } } ``` 这个示例代码实现了一个简单的静态资源服务器。当客户端请求一个 URL 时,服务器会读取对应的静态资源文件,如果找到了文件,则将其返回给客户端。如果找不到文件,则返回一个 404 Not Found 响应。在这个示例中,我们使用了线程池来处理客户端请求,通过解析 HTTP 请求报文,来获取客户端请求的 URL,然后再根据 URL 来读取对应的资源文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月初,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值