javaweb基础知识

JavaWeb

基本概念

web开发:

  • web网页,www.baidu.com

  • 静态web

    • html、css

    • 提供给所有人看的数据始终不会发生变化

  • 动态web

    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间、不同的地点看到的信息不同

    • 技术栈:Servlet/JSP,ASP,PHP

Web应用程序

可以提供浏览器访问的程序

  • a.html.......多个web资源这些web资源可以被外界访问,对外界提供服务

  • 通过URL访问,这个统一的web资源会放在同一个文件夹下,web应用程序——>Tomcat:服务器

  • 一个web应用由多部份组成

    • html css js

    • jsp servlet

    • java程序包

    • jar包

    • 配置文件(Properties)

web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来同一管理

静态web

  • .htm,.html,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。

     

  • 静态web存在的缺点

    • web页面无法动态更新,所有用户看到的都是统一个页面

      • 轮播图,伪动态

      • 使用技术:javaScript,VBScript

    • 数据无法持久化交互

动态web

动态展示:因人而异

缺点:加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布,需要停机维护

优点:①、web页面可以动态更新,所有用户看到都不是同一个页面

②、可以与数据库交互(数据持久化)

web服务器

ASP:微软:国内最早流行;在HTML中嵌入了VB脚本ASP+COM;

PHP:开发速度快,功能强大,代码简单,无法承载大访问量的情况

JSP/Servlet:①、B/S浏览和服务器

②、C/S浏览和服务器:基于java语言;可以承载高并发,高可用,高性能带来的影响

服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。

IIS: 微软的服务器

tomcat: Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4和JSP2.0规范。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat时,它实际上作为一个与Apache 独立的进程单独运行的。

安装Tomcat

进入Tomcat官网:Apache Tomcat® - Welcome!,安装电脑型号的安装包并解压

文件夹作用image-20220727114256341

启动Tomcat,在bin文件中找到startup.bat并点击。在浏览器中访问localhost:8080成功进入即安装成功

可以在bin文件夹中使用shutdown.bat关闭

配置

在D:\Environment\apache-tomcat-9.0.65\conf\serve.xml中可以配置启动的端口号

  • tomcat的默认端口号为8080

  • mysql的默认端口号为3306

  • http的默认端口号为80

  • https的默认端口号为443

    <Connector port="8080" protocol="HTTP/1.1"
                  connectionTimeout="20000"
                  redirectPort="8443" />

可以配置主机的名称

  • 默认的主机名为:localhost 127.0.0

  • 默认的网站应用存放的位置为webapps

    <Host name="localhost"  appBase="webapps"
               unpackWARs="true" autoDeploy="true">

网站是如何进行访问的:

1、输入一个域名,回车

2、检查本机的hosts配置文件中有没有这个域名的映射

  • 有,直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问

  • 没有,去总DNS服务器上找,找则到返回

发布一个web网站

  • 将自己写的网站,放到Tomcat中指定文件夹(D:\Environment\apache-tomcat-9.0.65\webapps)中就可以访问

    webapps:Tomcat服务器的web目录

    -ROOT

    -Taostudy:网站的目录名

    -WEB-INF

    -classes:java程序

    -lib:web应用所依赖的jar包

    -web.xml网站配置文件

    -index.html默认的首页

    -static文件夹

    -css,js,img......

HTTP

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:html,字符串…

  • 超文本:图片,音乐,视频,定位,地图…

  • 默认端口:80 HTTPS:安全的协议

  • 默认端口:443

http请求

客户端—->发请求(request)—->服务器(比如:访问百度)

// 请求地址
Request URL: https://www.baidu.com/
// 请求方法
Request Method: GET
// 状态代码
Status Code: 200 OK
// 远程地址
Remote Address: 14.215.177.38:443
// 引用站点策略
Referrer Policy: strict-origin-when-cross-origin

1、请求行

  • 请求行中的请求方式:GET

  • 请求方式:GET、Post.....

    • GET:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效。

    • POST:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效

2、消息头

  1. Accept: 告诉浏览器,它所支持的数据类型

  2. Accept-Encoding: 告诉浏览器,它支持哪种编码格式:GBK,UTF-8,GB2312,ISO8859-1

  3. Accept-Language: 告诉浏览器,它的语言环境

  4. Cache-Control: 缓存控制

  5. Connection: 告诉浏览器,请求完成是断开还是保持

  6. HOST:主机

http响应

// 缓存控制
Cache-Control: no-cache
// 保持连接(http1.1)
Connection: keep-alive
// 文本编码类型
Content-Encoding: gzip
// 响应类型
Content-Type: text/html;charset=utf-8

请求状态码

  • 200:响应成功

  • 3xx:请求重定向(304等等)

  • 4xx:找不到资源(404等等)

  • 5xx:服务器代码错误(500代码错误,502网关错误)

Maven

在javaweb开发中,需要使用大量的jar包,用maven自动导入和配置这些jar包

maven核心思想:约定大于配置

1、安装maven

2、配置环境变量

  • 系统变量中

    • M2_HOME 值:maven目录下的bin目录

    • MAVEN_HOME 值:maven的目录

      在系统的path中配置%MAVEN_HOME%bin

修改配置文件D:\Environment\apache-maven-3.8.1\conf\settings.xml:使用阿里云镜像

 <mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
   </mirror>

本地仓库

D:\Environment\apache-maven-3.8.1\conf\settings.xml中配置localRepository

把我们自建的本地镜像地址加上<localRepository>D:\Environment\apache-maven-3.8.1\maven_repo</localRepository>

解决配置maven中的问题

1、在IDEA中每次都要重复配置Maven

在IDEA中的全局默认配置中去配置 在Customize中的ALL setting中配置

2、Idea中配置tomcat在csdn中查找

3、maven默认web项目中的web.xml版本太老了web-app_2_3.dtd

去tomcat中的配置文件D:\Environment\apache-tomcat-9.0.65\webapps\ROOT\WEB-INF\web.xml中复制代码粘贴在项目

src\main\webapp\WEB-INF\web.xml中,如果爆红就重启idea

4、手动创建servlet

1、在java目录中创建一个文件

2、进入https://mvnrepository.com/artifact/选择一个servlet版本image-20220728204631014

放在pom.xml中image-20220728204737574

按ctrl+o选中doGet 按住ctrl再选中doPost导入两个方法

3、将D:\Environment\apache-tomcat-9.0.65\bin\startup.bat打开,再Untitled Document网站中复制以下代码到doGet方法中

image-20220728210528715

Servlet

sun再这些API中提供一个接口叫做Servlet,如果想开发一个Servlet程序,只需两步:

  • 编写一个类,实现servlet接口

  • 把开发好的java类部署到web服务器中

把实现了Servlet接口的java程序叫做Servlet

创建Servlet步骤

1、构建一个普通maven项目,删掉里面的src目录,以后我们的学习就再这个项目里面简历moudel,这个空的工程就是maven主工程

2、在Maven Repository: javax.servlet » javax.servlet-api (mvnrepository.com)中复制一个依赖代码放到pom.xml中的<dependencies>中,报错刷新即可

在搜索jsp-api找到javax.servlet.jsp复制一个依赖放到<dependencies>中,报错刷新即可

3、在项目目录上new一个moudel,选择maven,archetype中找到webapp创建一个子moudel,每个model是一个子模块

4、父项目(pom.xml)中会多一个<models>,子项目中会有一个<parent>,父项目中的jar包子项目可以直接使用

5、这样就不用管父项目,直接操作子项目

6、(Maven环境优化)将子项目中的web.xml换成以下代码

<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">
</web-app>

7、(将maven结构搭建完整)建好maven结构,在main中创建Diretory一个java和一个resources文件并标记为蓝色和绿色

8、编写一个Servlet

在java中新建一个Package(继承一个servlet接口),使用com.Tao.servlet类似结构,在这个目录中创建一个普通class

9、实现Servlet接口,在创建的class中直接继承HttpServlet,(点击HttpServlet按住ctrl+鼠标点击后接受(查看源码))

在方法体中直接使用ctrl+o,重写doGet()和doPost()方法

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /*ServletOutputStream outputStream = resp.getOutputStream();*/
       /*响应流*/
       PrintWriter writer = resp.getWriter();
       writer.print("hello,servlet");
  }

为什么需要编写servlet映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要链接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径,在web.xml中

<servlet>
       <servlet-name>hello</servlet-name>
       <servlet-class>com.Tao.servlet.HelloServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>hello</url-pattern>
   </servlet-mapping>

10、配置tomcat

11、启动测试

mapping映射问题

1、一个servlet可以指定一个映射路径

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern> //http://localhost:8080/s1/hello
</servlet-mapping>

2、一个servlet可以指定多个映射路径

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern> //http://localhost:8080/s1/hello
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern> //http://localhost:8080/s1/hello2都能成功
</servlet-mapping>

3、一个servlet可以指定通用映射路径

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern> //http://localhost:8080/s1/hello/jfskjfwajei无论什么都可以访问
</servlet-mapping>

4、默认请求路径(*就相当与任何字母,不可以在前面加任何路径)

<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern> //http://localhost:8080/s1直接不进index.jsp,把首页覆盖
</servlet-mapping>

5、优先级问题

例如有两个servlet,一个servlet的映射路径为/*,一个为/hello,则路径到/是前者,路径为/hello则为后者

指定了固有的映射路径优先级最高

ServletContext

web容器在启动的时候,他会为每个web程序都创建一个对应的servletContext对象,他代表了当前的web应用:

例如:Servlet1 Servlet2 Servlet3

URL:S1 URL:S2 URL:S3

它们三个的数据都可以存在ServletContext中,然后可以共享这些数据,都可以读取别人的数据,做到了相互联系

共享数据

我在这个Servlet中保存的数据可以在另外一个servlet中拿到

//被读取的类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

ServletContext context = this.getServletContext();
String username="曾涛";
/*将一个数据保存在了ServletContext中,,名字为:username 值为:username*/
context.setAttribute("username",username);

System.out.println("hello");
}
//读取上面类的类
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

/*将HelloServlet中username="曾涛"的值取出来*/
ServletContext context = this.getServletContext();
/*得到的数据强制转化为String*/
String username = (String)context.getAttribute("username");
//解决输出字符乱码
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
/*输出*/
resp.getWriter().print("名字"+username);
}
//配置web.xml中的servlet
//注册
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.Tao.servlet.HelloServlet</servlet-class>
</servlet>
<!-- localhost:8080/s1/hello/hello-->
//映射
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

//注册
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.Tao.servlet.GetServlet</servlet-class>
</servlet>
<!-- localhost:8080/s1/hello/hello-->
//映射
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>

获取初始化参数

//web.xml
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}

请求转发

路径不变页面变

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

/*将HelloServlet中username="曾涛"的值取出来*/
ServletContext context = this.getServletContext();
/*转发的请求路径*/
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
/*转发出去*/
requestDispatcher.forward(req,resp);
}

访问localhost:8080/servlet-02/sd4跳转到localhost:8080/servlet-02/gp页面

读取资源文件

用到properties类

  • 在java目录下新建properties

  • 在resources目录下新建properties发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath。

思路:需要一个文件流

image-20220730085448935

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*通过context拿到所有东西,得到资源流*/
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/Tao/servlet/aa.properties");

Properties prop = new Properties();
prop.load(is);
String user=prop.getProperty("username");
String pwd=prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}

HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;|

  • 如果要获取客户端请求过来的参数:找HttpServletRequest

  • 如果要给客户端响应一些信息:找HttpServletResponse

     

(分类)负责向浏览器发送数据的方法

public ServletOutputStream getOutputStream() throws IOException;
public PrintWriter getWriter() throws IOException;

相应状态码

int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
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_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

常见应用

1、向浏览器输出消息

2、下载文件

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// - 要获取下载文件的路径
String realPath = "D:\\IDEA\\idea project\\javaweb-02-servlet\\response\\src\\main\\resources\\曾涛.jpg";
System.out.println("下载的路径:"+realPath);
//- 下载文件名是啥 /曾涛.jpg 获取最后一个/后的字符就为文件名 \\转义\ +1(\后面的)
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//- 设置想办法让浏览器支持下载我们需要的东西,web下载文件的头信息

resp.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName,"utf-8"));
//- 获取下载文件的输入流
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();

实现重定向

B web资源收到客户端A请求后B通知客户端A去访问另外一个web资源C

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//发送一个请求,重定向到另一个页面
resp.sendRedirect("/response/filedown");
}

面试题:重定向和转发的区别

相同:页面都会跳转

不同:重定向url变,转发url不变

 

HttpServletRequest

HttpServletRequest代表客户端请求,用户通过Http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest,通过

这个HttpServletRequest的方法,获得客户端的所有信息。

  • 获取前端参数

    //getParameter这个获取一个值
    String username = req.getParameter("username");
    String password = req.getParameter("Password");
    //getParameterValues这个获取多个值
    String[] hobbys = req.getParameterValues("hobbys");
  • 请求转发

    前端

    <div style="text-align:center">
    <%-- 这里表单表示的意思:以post方式提交表单,提交到我们的Login请求中--%>
    <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="女孩">女孩

    <input type="submit">
    </form>

    </div>

后端

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求和回应的编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//getParameter这个获取一个值
String username = req.getParameter("username");
String password = req.getParameter("Password");
//getParameterValues这个获取多个值
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);

}

cookie、session

会话

无状态的会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。 有状态的会话:一个用户打开一个浏览器,访问某些资源(网站),下次再来访问该资源(网站),我们会知道这个用户曾经来过,称之为有状态会话;

一个网站证明你来过:

①、服务端给客户端一个信件,客户端下次访问时带上信件即可,cookie

②、服务器登记你来过了,下次你来的时候匹配你,session

保存会话的两种技术(例如登录一个网站之后下一次就不用在登陆了)

cookie:

  • 客户端技术,(响应、请求)

session:

  • 服务端技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中。

cookie

  1. Cookie[] cookies = req.getCookies();// 获得cookie

  2. cookie.getName();// 获得cookie中的key

  3. cookie.getValue();// 获得cookie中的value

  4. new Cookie("lastLoginTime",System.currentTimeMills()+"");// 新建一个cookie

  5. cookie.setMaxAge(24*60*60);// 设置cookie的有效期,单位:秒

  6. resp.addCookie(cookie);// 响应给客户端一个cookie

cookie:一般会保存在本地的用户目录下appdata

  • 一个Cookie只能保存一个信息;

  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;

  • Cookie大小有限制4kb

  • 300个cookie浏览器上限

删除cookie

  1. 不设置有效期,关闭浏览器,自动失效

  2. 设置有效期时间为 0

session

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Seesion对象。

  • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在。

  • 用户登录之后,整个网站它都可以访问。(保存用户的信息;也可以保存购物车的信息)

 

session的使用:

//创建一个网页的session,记录下id
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.setAttribute("name",new person("曾涛",1));
//获取session的ID
String sessionId=session.getId();
//判断session是不是新创建的
if (session.isNew()){
resp.getWriter().write("session创建成功,ID:"+sessionId);
}else{
resp.getWriter().write("session已经存在,ID:"+sessionId);
}
}
//手动注销这个session id
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//手动注销
session.invalidate();
}
//自动注销session id,在web中
<session-config>
<!-- 一分钟后自动注销session-->
<session-timeout>1</session-timeout>
</session-config>

session和cookie的区别

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)

  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)

  • Session对象由服务创建

cookie:

img

session:

img

JSP

Java Server Pages:Java服务端页面,和servlet一样,用于动态web技术 最大的特点:

  • 写jsp就像在写html

  • 区别:

    • html只给用户提供静态的数据

    • jsp页面中可以嵌入Java代码,为用户提供动态数据

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet! JSP最终也会被转换成为一个Java类! JSP本质上就是一个Servlet

// 初始化
public void _jspInit() {}
// 销毁
public void _jspDestroy() {}
// JSP服务
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

img

在jsp中写java代码在<%%>中写

final javax.servlet.jsp.PageContext pageContext;    // 页面上下文
javax.servlet.http.HttpSession session = null; // session
final javax.servlet.ServletContext application; // applicationContext
final javax.servlet.ServletConfig config; // config
javax.servlet.jsp.JspWriter out = null; // out
final java.lang.Object page = this; // page:当前
HttpServletRequest request; // 请求
HttpServletResponse response; // 响应

jsp语法和指令

JSP作为java技术的一种应用,它拥有一些自己扩充的语法,Java所有语法它都支持!

JSP表达式

<%--JSP表达式,用来将程序的输出,输出到客户端 <%= 变量或者表达式%>--%>
<%= new java.util.Date()%>
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum+=i;
}
out.print("<h1>sum="+sum+"</h1>");
%>

//在代码中嵌入html代码
<%for (int i = 0; i < 3; i++) {%>
<h1>Hello World!<%=i%></h1> //<%=i%>相当于${i}
<% } %>

JSP声明

//在<%!  %>中,会被编译到生成的java类中,而其他的就会生成到jspService中
<%!
static {
System.out.println("loading Servlet!");
}
private int globalVar =0;
public void kuang(){
System.out.println("进入了该方法!");
}
%>

JSP语法

<%%>jsp脚本片段
<%=%>表达式输出一个值
<%!%>定义全局

jsp注释<%-- --%>

html注释<!-- -->

jsp的注释不会再客户端显示,html会(审查代码中)

JSP指令

定制错误页面,web.xml定制全局的错误页面

<error-page>
<error-code>500</error-code>
<location>/Error/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/Error/404.jsp</location>
</error-page>

拼接两个页面,将两个页面合二为一(相同的参数报错)

<%@include file="路径1"%>

<%@include file="路径2"%>

拼接两个页面,本质还是三个(相同的参数不报错)

<jsp:include page="页面1">

<jsp:include page="页面2">

9大内置对象

  • PageContext 存东西(页面上下文)

  • Request 存东西

  • Response

  • Session 存东西

  • Application(ServletContext) 存东西

  • Config(ServletConfig)

  • out

  • page

  • exception

//存东西
<%
pageContext.setAttribute("name1","曾涛1");//保存的数据只在一个页面中有效
request.setAttribute("name2","曾涛2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","曾涛3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","曾涛4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
<%
//通过pageContext来取,我们通过findAttribute来寻找
//从底层到高层找依次为page-->request-->session-->application
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表达式输出${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3> //若没有东西不会输出
<h3><%=name5%></h3> //若没有值会输出null

前端页面转发

<%
pageContext.forward("/index.jsp");
%>
//servlet中的页面转发:
requset.getRequestDispatcher("/index.jsp").forward(request,response);

JSP标签,JSTL标签,EL表达式

EL表达式

${}

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<!--JSTL表达式依赖-->
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<!--standard标签库-->
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

获取数据

执行运算

获取web开发的常用对象

posted @   Ctrl+`V  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示