javaweb基础知识
基本概念
web开发:
-
web网页,
-
静态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官网:
文件夹作用
启动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、消息头
-
Accept: 告诉浏览器,它所支持的数据类型
-
Accept-Encoding: 告诉浏览器,它支持哪种编码格式:GBK,UTF-8,GB2312,ISO8859-1
-
Accept-Language: 告诉浏览器,它的语言环境
-
Cache-Control: 缓存控制
-
Connection: 告诉浏览器,请求完成是断开还是保持
-
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版本
放在pom.xml中
按ctrl+o选中doGet 按住ctrl再选中doPost导入两个方法
3、将D:\Environment\apache-tomcat-9.0.65\bin\startup.bat打开,再
Servlet
sun再这些API中提供一个接口叫做Servlet,如果想开发一个Servlet程序,只需两步:
-
编写一个类,实现servlet接口
-
把开发好的java类部署到web服务器中
把实现了Servlet接口的java程序叫做Servlet
创建Servlet步骤
1、构建一个普通maven项目,删掉里面的src目录,以后我们的学习就再这个项目里面简历moudel,这个空的工程就是maven主工程
2、在
在搜索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);
}
访问
读取资源文件
用到properties类
-
在java目录下新建properties
-
在resources目录下新建properties发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath。
思路:需要一个文件流
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
-
Cookie[] cookies = req.getCookies();// 获得cookie
-
cookie.getName();// 获得cookie中的key
-
cookie.getValue();// 获得cookie中的value
-
new Cookie("lastLoginTime",System.currentTimeMills()+"");// 新建一个cookie
-
cookie.setMaxAge(24*60*60);// 设置cookie的有效期,单位:秒
-
resp.addCookie(cookie);// 响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下appdata
-
一个Cookie只能保存一个信息;
-
一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
-
Cookie大小有限制4kb
-
300个cookie浏览器上限
删除cookie
-
不设置有效期,关闭浏览器,自动失效
-
设置有效期时间为 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:
session:
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)
在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>
获取数据
执行运算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?