【2023】J2EE课程笔记
考完试了,就把这段时间做的笔记发布,可能会有混乱和不准确的地方。但是在这段时间学后收获也是很大的。
20230829
.java->.class->jvm->native code
高可靠高性能高并发
OSI会话模型
TLV接口
TLV(Type-Length-Value)是一种数据格式,通常用于数据通信和协议中。TLV具有以下三个主要部分:
* Type(类型):表示数据的类型。
* Length(长度):表示数据的长度。
* Value(值):实际的数据。
TLV格式常常被用于嵌入式系统中,其中,Type字段标识了数据的性质,Length字段标识了数据的长度,Value字段则是实际的数据。
此外,某些情况下,TLV也用于网络协议的传输,比如DHCP协议的TLV就包括选项和值的定义,以及它们的具体内容。
需要注意的是,具体的TLV实现可能会因应用场景和需求而有所不同,因此具体的实现细节可能需要参考特定的文档或规范。
0831
线程不可能无限创建,受硬件和其他因素的影响
ThreadPool 线程池,创建公共资源。
new 运算慢,服务启动慢
set是唯一性集合
list是顺序性集合
老师给的java计算机代码示例讲解
继承描述”是“的关系
聚合描述”拥有“的关系
延迟初始化:不必要在构造函数中设置初值,此时还没有实例对象,可以在set方法中初始化
~~线程创建第一个语句wait()~~
通过继承Thread,并实现run方法,创建线程实例开始一个新线程。
然后notify()是唤醒wait()的方法。
wait和notify是Object的方法
synchronized同步
如果同步访问同一数据
对共享数据的保护
用锁机制
并发:事件的发生没有因果关系
```java
Javax.servelet.http.*
public class HelloServelet extend HttpServelet(){
init();
还有一些其他的东西
//getServletInfo();很蠢
sedtory();
}
```
0905
命名规范
BEA公司
TLV结构
TLV(Type-Length-Value)是一种常用的用于通信的结构体格式。TLV由三个部分组成:
Type(类型):表示数据的类型。
Length(长度):表示数据的长度。
Value(值):即数据本身。
这种结构的特点是,通过类型和长度可以确定值部分的数据结构,使得数据通信变得相对简单和标准化。同时,由于TLV结构具有嵌套性,可以用来包装协议的实现。
MIME类型
浏览器传输
Headers
回车换行*2
Content
tomcat
lib放库 。jar
webapp放web应用
java编译
```
javac -d . classpath c:\javaee\xxx.jar HelloServlet.java
```
-classpath <目录和 zip/jar 文件的类搜索路径>
-d
–describe-module <模块名称>
所有编译好的类放在classes文件夹下
-d指示编译后文件的放置位置
lib文件夹
URL=协议-主机地址-文件
子类不能抛出父类未声明的异常
NullPointerException 是运行时异常,可以通过编程的手段处理,是不会被检查,不被上面的约束限制。
0907
URL重写
Session
Cookie
30 单位分钟(维持会话时间默认单位)
***HTTPSESSION**
内存中的java必须序列化,不然存不进去
**Srtvlet**
**HttpServelt**
**ServletRequest**
**ServeltResponse**
**HttpServletRequest**
**HttpServletResponse**
**ServeltConfig**
**ServeltContext**
**getServlrtConfig().getServletContext**
**getServletContext()**
**RequestDispatcher**
**forward(转发)**转发后不转发了
**include**转发后回来可以继续访问
forward重点是产生两个不同的request,include一直只有一个request
log4j
```
void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
void include(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
```
0919
java注释有三种注释
- 单行注释
- 多行注释
- javadoc风格的注释
```
/**
上面有两个星号
@since 1.2
@version
@author
*/
```
Annotation注解
@Override - 重载方法
@Deprecated - 已过时
```
public @interface MyAnnotation {
int Value();//属性,要求加括号,但是它不是函数
// 任何注解必须有Value属性
}
```
考试:
java.lang.reflect.Method
java.land.Class
java.lang.ClassLoader
Servlet
Jsp,JspPage
Tag
Filter
```java
Class clazz = Student.class;
获取类
迭代会获取到类中所有public的方法
// for (Method method : clazz.getMethods()) {
//// System.out.println(method.toString());
// System.out.println(method.getName());
// }
也可获取某一个特定的方法,第一个参数是方法名,第二个参数是参数
Method getName = clazz.getMethod(“getName”,null);
// System.out.println(getName.toString());
System.out.println(getName.getName());
invoke执行了
System.out.println(getName.invoke(null, null));
```
getServletContext().log()
Enumeration(过时)
Iterator
区别就是方法名
0921
默认情况下,只有来自客户端的请求会被过滤器拦截
dispatcher这个属性进行设置,不止客户端,换可以有转发等
@WebFilter
多Filtter顺序问题:
按从上到下顺序
url-Pattern 》 servlet-name
listener
事件处理模型
java.util.EventObject
protected source : Object
- getSource() :Object
edm
委托模型-事件处理模型
将事件交给听众
ServletContentListener
```java
EventListener是空接口
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);
void contextDestroyed(ServletContextEvent var1);
}
```
ServletContextEvent
```java
本质还是EventObject的那一套,观察者模式
public class ServletContextEvent extends EventObject {
private static final long serialVersionUID = -7501701636134222423L;
public ServletContextEvent(ServletContext source) {
super(source);
}
public ServletContext getServletContext() {
return (ServletContext)super.getSource();
}
}
```
~~sec.setAttribute();~~
PageContext
JavaWeb一共四大域对象,Servlet可以用request,response,application。在JSP中可以用request,response,application,pagecontext。详细链接
ServletRequest
HttpSession
~~* sessionCreated()~~
在HttpSessionListener中找到了这个方法
```java
public interface HttpSessionListener extends EventListener {
void sessionCreated(HttpSessionEvent var1);
void sessionDestroyed(HttpSessionEvent var1);
}
```
ServletContext
属性监听器都是有 添加 , 移除, 替代的三个方法。
ServletContextAttributeListener
```java
public interface ServletContextAttributeListener extends EventListener {
void attributeAdded(ServletContextAttributeEvent var1);
void attributeRemoved(ServletContextAttributeEvent var1);
void attributeReplaced(ServletContextAttributeEvent var1);
}
```
HttpSessionAttributeListener
```java
public interface HttpSessionAttributeListener extends EventListener {
void attributeAdded(HttpSessionBindingEvent var1);
void attributeRemoved(HttpSessionBindingEvent var1);
void attributeReplaced(HttpSessionBindingEvent var1);
}
```
HttpBoundEvent
valueBound()
valueUnbound()
```
public interface HttpSessionBindingListener extends EventListener {
default void valueBound(HttpSessionBindingEvent event) {
}
default void valueUnbound(HttpSessionBindingEvent event) {
}
}
```
set
remove
注意:getValue()获取的是过去的值
实现ServletContextListener接口的两个方法,然后在web.xml中配置,监听器就可以正常运行了。
```xml
<listener-class>
</>
</>
```
framework-框架
快速开发web应用的框架
模型是视图的听众
——姜老师
0926
四个作用域
scope=”application/session/request等”
application不适合网络,只适合一个人
request每次请求创建一个新的
property=“*”适配所有进行属性设置,匹配字段名,有则设置
MVC2
降低粒度,进行拆分
Controller , DIspatch
Servlet
public void service(ServletRequest req,ServletResponse res) throws ServletException ,IOExceptoin
Struts
Action
ActionForm
ActionForword
name= ,path=
URI进行转发,只是路由
0928
Action is an adapter
dispath
uri,path
uri:protocol,host,path
ActionForward execute(ActionMapping maipping,ActoinForm,HttpServletRequest,HttpServletResponse)
如何两个不同进程之间进行通信?
共享内存,socket
DispatchACtoin
MappingDispatchAction
path转发,parameter类名
LookupDispatchAction
i18n问题
Struts2
10月10日
戈培尔效应
谎言重复1000遍成为真理
Iaas,PaaS,SaaS
Spring 是一个框架**IOC框架 控制反转**
容器负责建立,以前是由A控制B(A创建B),现在将A和B都交给容器。
Servlet s = (Servlet)Beans.instantiate(getClass().getClassLoader(),servletClass())
动态实例化 在运行时创建对象
new.com.abc.servlet.HelloServlet()
xml称为元语言 创建语言的语言 meta
Java反编译
代码混淆
Google avaiator
@autowired
11月5号下午7,8节考试
1012
download struts framework
spring framework
/WEB-INF/lib
deploy front controller
web.xml
servlet, servlet-mapping
\*.do
```
<servlet-name>
<servlet-class>
<init-param>
<param-name>config
<param-value>/WEB-INF/struts/s.xml
```
struts2前端控制器使用filter,不使用servlet
```
```
spring 创建组件 根据id控制
ServletContextListener
contextInitialized等两个方法
```
<>param-value
getServletConfig().getInitParameter(“”) : ServletConfig
getInitParamter() : servletContext
```
```
这是在xml中启用注解的代码
```
Action
**所有参数都放在一个Map集合中**
Controller处理函数返回数据
- ModelAndView
- Model
- ModelMap
- Map
- view
- String
- void
- @ResponseBody Object
注意jsp视图技术
配置时会有前缀和后缀
只需返回文件名
Spring View 组件
ViewResolver
Ordered接口
时序数据库
jms
1017
http component
tomcat in
JMS java消息服务
```
public class Action{
ActionMapping mapping
ActionForm form.
HttpServeltRequest
HttpServletResponse
}
ActionForward execute(ActionMapping maipping,ActoinForm,HttpServletRequest,HttpServletResponse)
```
* [ ] 111
```
@TRANScational(propagation)
REQUEST
NEVER
```
Spring不支持分布式事务,需要第三方支持
AromikTransactionsEssentials
所有电子邮件的父类
MimeMessage
Interface Message
消息服务器软件
kafks
Interface Destination
消息目的地
最后
jsp Implicit Object JSP隐式对象9个
![](vx_images/282823913231510.png =697x)
**JSPWriter out**
**PageContext pa**
**ServletContext**
jsp也可以部署
jspEL表达式语言
![](vx_images/205474413234014.png =573x)
大多是**Map**集合,除了一个——pageContext
<%– 注释 –%>
<>
Servlet Annoation
SpringControl相关注解
返回值
DispatchAction
lookupDispatchAction
Fin
- **ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”); /要知道下面这条语句和上面的语句,二者有何不同?ApplicationContext ctx = new FileSystemXmlApplicationContext(“beans.xml”);**
从类的上下文加载,一般在类的文件中,常常是不变的,故而在开发和测试环境中使用。
从文件系统中进行加载上下文,不受约束,可以改变xml文件,适用于生产环境。
附上官方的解释
ClassPathXmlApplicationContext: Useful for test harnesses as well as for application contexts embedded within JARs.
对测试框架和jars内的应用程序上下文有用
FileSystemXmlApplicationContext: Useful for test harnesses as well as for standalone environments.
对测试框架和标准环境有用
关于test harnesses的翻译与理解:(测试框架) http://www.51testing.com/html/51/10851-77900.html#:\~:text=Test%20harnesses%20should%20include%20the%20following%20capabilities%3A%201,results.%204%20A%20standardized%20form%20of%20failure%20reporting.
- **如何获取ApplicationContext对象?**
有一个接口Interface ApplicationContextAware
有一个方法void setApplicationContext(ApplicationContext applicationContext)
用于设置当前运行的对象的上下文
有一个类WebApplicationContextUtils
可以使用这个方法public static WebApplicationContext getWebApplicationContext(ServletContext sc)
获取当前根web应用程序上下文
但是这个并不是最好的方法,一般也不用,因为有更好更快捷的。
对于java程序,可以使用一个全局的静态方法来获取ApplicationContext。
一定记住默认的bean的scope属性是singleton。只有一个bean对象实例。
- **scope的值可以是singleton, prototype, request, session, application, 以及websocket。着重分析singleton和prototype的区别**
* singleton :【默认值】在spring IOC容器中仅存在一个bean实例,单例模式。适用于无状态的bean,如 工具类和服务类
* prototype :【原型】每次从容器中获取bean时都返回一个新的bean。即getBean()=new XXXBean()
* request : 每次HTTP请求都会创建一个bean,该作用域只适用于WebApplicationContext
* session :在HTTP会话中创建一个bean,用于维持请求的状态,如用户会话。
* application :在整个web应用中创建一个全局的bean,用于存储全局配置数据等
* websocket : 在每个websocket中创建一个bean实例,用于通信。
- **如何在xml文件中声明使用注解的形式**
在beans中间加上如下即可
*这个之前我写的是错的*
~~context:annotation-config/~~
- **组件类可以通过哪些注解声明?**
@Controller @Service @Component @Repository
资料复习
- 异常分为几类,简单讲解一下。
java异常分为 运行时异常 和 编译时异常
运行时异常(RunTimeException)一般是程序员自己代码的问题,常见的有空指针异常(NullPointerException),除零产生的异常等。
编译时异常(CheckedException)是在编译阶段产生的异常,如关键字错误,括号不匹配等。
- Servlet启动都经过哪些步骤?
Servlet是javaee的服务模块,通常其生命周期如下:
无参构造函数-》init初始化-》service调用服务-》destory销毁
URI地址一般是由三部分构成:协议,域名,路径
对于上面的网址
https:代表使用https作为传输协议
/video/BV1J34y1u7xw:是路径,在服务器中文件所在的位置(当然可能是虚假的)
?后面是向后端请求时的参数,以键值对的形式存在。
- 我们使用`ServletResponse.setContextType(String)`时可以有什么类型呢?
```
text/html text/plain text/xml
text/json application/json application/octet-stream
charset=utf-8
```
- 重定向(response.sendRedirect)和转发(RequestDispatcher.forword)的区别
重定向和转发都是跳转,但是转发是内部转发,而且可以携带参数,重定向则没限制,你可以跳转到任意的页面。
而且重定向相当于页面重新对重定向的页面发起了请求。
自己写的,觉得挺好舍不得删:重定向是一个新的开始,我的第一个请求返回响应,将页面重新定位到我指导的位置,在这期间,页面发送了两次request请求,一次是普通的http请求,一次是根据重定向的普通http请求,在用户看来,服务端发生重定向时我网址栏会变化的,response。sendRedirect
转发则与其有这不同,我将接收到的请求进行转发,意味着这是由该次请求进行的,并不由客户端主导,只有一个req请求,在这次转发中是共享客户端携带的参数的,或者说是可以进行参数的传递的,转发者一般是对前端所传数据的处理者,被准发者才是真正的执行者。RequestDispatcher.forword(req,resp)
- servlet的5个函数,将其默写出来 hh无论何时我都会觉得这个很重要啊,后面有重复的
init
service
destory
getServletInfo
getServletConfig
```
void init(ServletConfig var1) throws ServletException
```
```
void service(ServletRequest var1,ServletResponse var2) throws ServletException,java.io.IOException
void destory()
String getServletInfo()
ServletConfig getServletConfig()
```
- Servlet的xml配置基本结构
省略结束符号
```
hello
com.example.HelloServlet
hello
/hello/a.html
```
- HTTP的七种访问方法
GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE
- ServletContext 中`getContextPath`和`getRealPath`的区别
getContextPath获取到相对路径,并且可以使用虚拟路径。
getRealPath获取到绝对路径,相对于盘符的路径。(绝对路径)
- dis ?我想干什么
- 我已经洞悉了JSP9大内置对象的实质!
在`javax.servlet.jsp.PageContext`这个类中
```java
public static final String PAGE = “javax.servlet.jsp.jspPage”;
public static final String PAGECONTEXT = “javax.servlet.jsp.jspPageContext”;
public static final String REQUEST = “javax.servlet.jsp.jspRequest”;
public static final String RESPONSE = “javax.servlet.jsp.jspResponse”;
public static final String CONFIG = “javax.servlet.jsp.jspConfig”;
public static final String SESSION = “javax.servlet.jsp.jspSession”;
public static final String OUT = “javax.servlet.jsp.jspOut”;
public static final String APPLICATION = “javax.servlet.jsp.jspApplication”;
public static final String EXCEPTION = “javax.servlet.jsp.jspException”;
```
- Servlet的五个函数
```
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
```
- ServletConfig的函数
```
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration
}
```
- Java四大域对象
page
request
response
application
PageContext
JavaWeb一共四大域对象,Servlet可以用request,response,application。在JSP中可以用request,response,application,pagecontext。详细链接
- Controller处理函数返回数据
* ModelAndView
* Model
* ModelMap
* Map
* view
* String
* void
* @ResponseBody Object
- 注意jsp视图技术
配置时会有前缀和后缀
只需返回文件名
- filter接口和FilterChain接口
```java
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
```
```java
public interface FilterChain {
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
```
- Spring Controller的8个返回数据
* void 返回void可以直接进行重定向,如果没有重定向的话,那么-
* String -可以返回String,这个String是视图的逻辑名字,通过视图解析器解析为对应的物理视图地址。返回视图。
* Module
* ModuleAndView
* View
* ModuleMap
* Map
* @Response Object 返回JSON
- `javax.servlet.annotation`的内容
![](vx_images/503184716237438.png =408x)
重点先看WEBServlet,WEBListener,WEBFilter吧
填空题主要部分
竟然都是Struts的内容,且与分发有关,过时的技术也有学习的必要。
毕竟现在流行的技术框架或多或少的都借鉴过前人的思路。
现在也许看不出什么,等以后就会突然茅塞顿开。
DIspatchAction
分发有个函数
```
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response
)throws Exception
```
通常来说我们如果要实现简单的CRUD,可以对每一个操作都继承DispatchAction,但是会产生四个类,看起来非常不简洁美观。
我们可以将这些操作组合到一个类中,通过一些标识去决定使用什么方法。
我们这里使用Struts的配置函数,为每一个操作提供唯一标识。
在前端配置的唯一标识通过`getParameter(mapping,form,request,response)``getMethodName(mapping,form,request,response,parameter)`获取(先获取键,再获取值,在配置中是键值对的形式。
获取到后就可以根据反射机制来invoke执行一下了。
挺复杂,逻辑挺简单
LookupDispatchAction
修补上一个抽象类的缺陷
无法应对特殊字符(中文,空格等)
无法抱枕安全性,前端的提交即是实际的名称,URI暴露。
这里通过一个配置文件`.properties`进行键值对的映射,值当然可以是任何字符了。
同时前端的提交是键,也不会直接暴露实际名称。
在类的实际实现中利用一个`HashMap`做函数字典,put了键以及对应的函数名,这样也保证了对应的正确性。`lookup查找`也体现在这里
MappingDispatchAction
很简短,感觉没get到什么东西,好像是为一个后端控制器指定了多个路径?进行了聚合?
问题待解决
- 对于`Fin.2.``如何获取ApplicationContext对象`这一问题我需要在看看源码,在有网的时候看看。
- 考虑`context:annotation-config/`和`/mvc:annotation-driven`的关联,因为我之前在总结的时候把这两个总结到一起了。
估计是配置注解的xml项
- `Fin.5`我没有考虑到`@Repository`这的注解也可以用于声明组件类。需要找到用处。
- jsp的9个隐含对象到底是什么类?全是jsp吗?
- javaweb的四大域对象,究竟是什么类?
- EL语言中applicationScope隐含对象的类型
- 弄明白URI和URL的区别!为什么HttpServletRequest的getRequestURI和getRequestURL的返回值不同?
- JSP还是得看一看啊。
- 关于标记库描述符文件的内容需要了解一下
- 关于Cookie类的相关信息
- ~~ServletRequest为什么返回的是一个String,他有什么用? String getProtocol();~~
- web.xml中
的用处有什么呢?在spring-controller.txt - RequestDispatcher看看官方的说明吧,虽然简单,但还是没有那么通透。
- HttpSession看看函数
- 注释的看看那WebServlet,WebListener,WebFilter
解决
- ApplicationContext是Springboot的IOC容器,有时候我们需要获取到该容器,一个方法就是实现ApplicationContextAware,它有个方法setApplicationContext可以获取到该容器。
- 参考
mvc:annotation-driven/用于MVC的注解开启,自动加载了一些类。
context:annotation-config/会为已经注册过的bean进行装配
所以对于MVC还是用的MVC的
- @Respority和@Mapper很像,都是DAO层的注解,用于标识功能和便于识别。
- 不,你看下图
![](vx_images/279751420250273.png =324x)
- 参考
- 在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对象指定所要查找的标识符的作用域后,系统 将不再按照默认的顺序(page、request、session以及application)来查找相应的标识符。
- 参考
- 创建一个 cookie,它是由 servlet 发送到 Web 浏览器、由浏览器保存、稍后发送回服务器的少量信息。Cookie 的值可以唯一标识客户端,因此 Cookie 通常用于会话管理。
建Cookie – HttpServletResponse.addCookie(Cookie)
获取Cookie – HttpServletRequest.getCookie()
描述,域名,最大过期时间,名,值,安全性,版本等getset方法
- 在ServletRequest中,getProtocol返回的是协议号
正如名字所示,获取协议,在一个网络请求中包括请求头和请求体,在请求头中有说明协议版本的字段。
![](vx_images/544673516249571.png =979x)
一个说明字段是String很容易让人理解。
- RqequestDispatcher 接受来自客户端的请求并将请求发送到服务器上任意位置
forward将请求从 Servlet 转发到服务器上的其他资源(Servlet、JSP 文件或 HTML 文件)。
include在响应中包含资源(servlet、JSP 页面、HTML 文件)的内容。
- HttpSession
主要是getset Attribute的方法,还有获取时间相关,标识符等。
- 注释
```
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default “”;servlet 的 name
String[] value() default {};servlet 的 URL 模式
String[] urlPatterns() default {};servlet 的 URL 模式
int loadOnStartup() default -1;servlet 的启动时加载顺序
WebInitParam[] initParams() default {};servlet初始化参数
boolean asyncSupported() default false;声明 Servlet 是否支持异步操作方式。
String smallIcon() default “”;
String largeIcon() default “”;
String description() default “”;
String displayName() default “”;Servlet 的显示名称
}
```
```
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebListener {
String value() default “”;声明一个Listener
}
此注解用于声明 WebListener。任何使用 WebListener 批注的类都必须实现一个或多个 ServletContextListener、ServletContextAttributeListener、ServletRequestListener、ServletRequestAttributeListener、HttpSessionListener 或 HttpSessionAttributeListener 或 HttpSessionIdListener 接口。
```
```
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {
String description() default “”;
String displayName() default “”;
WebInitParam[] initParams() default {};
String filterName() default “”;
String smallIcon() default “”;
String largeIcon() default “”;
String[] servletNames() default {};应用过滤器的 Servlet 的名称。
String[] value() default {};筛选器应用的 URL 模式 默认值为空数组。
String[] urlPatterns() default {};筛选器应用的 URL 模式 默认值为空数组。
DispatcherType[] dispatcherTypes() default应用过滤器的转发程序类型 {DispatcherType.REQUEST};
/* FORWARD,
INCLUDE,
REQUEST,
ASYNC,
ERROR;
*/
boolean asyncSupported() default false;
}
```
JSP简单学习
jsp是在html中嵌入java代码
jsp也是在j2ee服务端中的java组件
第一次运行
在第一次运行jsp代码时会经历以下步骤,将jsp转为java代码,将java代码转为class文件。
所以通常会比较慢,编译后就好多了。
四大作用域
* request
* session
* page
* application
部署jsp
```xml
```
jsp作为servlet的继承者,自然是可以部署的,但是一般不会这么做。
内嵌java语法
* `<%@ %>`jsp指令的语法
* `<%= %>`jsp表达式的语法
* `<%! %>`jsp声明的语法
* `<%– –%>`jsp注释的语法
* `<% %>`jsp中可以放置任何合法的java代码,其最终会被转换到service代码内。
jsp指令
* `<%@ page 属性列表%>` 定义页面的依赖属性,如脚本语言,error页面,缓存需求等
* `<%@ include file=”afile” %>` 包含其它文件
* `<%@ taglib uri=”” prefix=”a” %>` 标签库的定义
例子
```
<%@ page import=”java.util.*,java.net.*,java.io.*“ session=”true” isErrorPage=”false” errorPage=”/error.jsp”%>
<%@ include file=”copyright.html” %>
```
Jsp声明
声明函数或变量,供后续使用。
```
<%! int i = 0;%>
<%! Circle a = new Circle(2.0);%>
```
或者
```
int i = 0;
jsp:declaration/
```
Jsp的action行为标签
![](vx_images/203855216257604.png =710x)
![](vx_images/113875515231145.png =781x)
9个隐式变量(内置变量)
```
HttpServletRequest request
HttpServletEesponse response
ServletContext application
PageContext pagecontext
ServletConfig config
HttpSession session
JspWriter out
Exception exception
page,等价于this
```
考试重点JspWriter,PageContext
```java
package javax.servlet.jsp
public abstract class JspWriter extends Writer {
public static final int NO_BUFFER = 0;
public static final int DEFAULT_BUFFER = -1;指示 Writer 已缓冲并使用实现默认缓冲区大小的常量。
public static final int UNBOUNDED_BUFFER = -2;常量表示 Writer 是缓冲的并且是无界的;这在 BodyContent 中使用。
protected int bufferSize;
protected boolean autoFlush;
protected JspWriter(int bufferSize, boolean autoFlush) {
this.bufferSize = bufferSize;
this.autoFlush = autoFlush;
}
public abstract void newLine() throws IOException;
public abstract void print(boolean var1) throws IOException;
public abstract void print(char var1) throws IOException;
public abstract void print(int var1) throws IOException;
public abstract void print(long var1) throws IOException;
public abstract void print(float var1) throws IOException;
public abstract void print(double var1) throws IOException;
public abstract void print(char[] var1) throws IOException;
public abstract void print(String var1) throws IOException;
public abstract void print(Object var1) throws IOException;
public abstract void println() throws IOException;
public abstract void println(boolean var1) throws IOException;
public abstract void println(char var1) throws IOException;
public abstract void println(int var1) throws IOException;
public abstract void println(long var1) throws IOException;
public abstract void println(float var1) throws IOException;
public abstract void println(double var1) throws IOException;
public abstract void println(char[] var1) throws IOException;
public abstract void println(String var1) throws IOException;
public abstract void println(Object var1) throws IOException;
public abstract void clear() throws IOException;
public abstract void clearBuffer() throws IOException;
public abstract void flush() throws IOException;
public abstract void close() throws IOException;
public int getBufferSize() {
return this.bufferSize;
}
public abstract int getRemaining();此方法返回缓冲区中未使用的字节数。
public boolean isAutoFlush() {
return this.autoFlush;
}
}
```
```java
package javax.servlet.jsp
public abstract class PageContext extends JspContext {
public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
public static final String PAGE = “javax.servlet.jsp.jspPage”;
public static final String PAGECONTEXT = “javax.servlet.jsp.jspPageContext”;
public static final String REQUEST = “javax.servlet.jsp.jspRequest”;
public static final String RESPONSE = “javax.servlet.jsp.jspResponse”;
public static final String CONFIG = “javax.servlet.jsp.jspConfig”;
public static final String SESSION = “javax.servlet.jsp.jspSession”;
public static final String OUT = “javax.servlet.jsp.jspOut”;
public static final String APPLICATION = “javax.servlet.jsp.jspApplication”;
public static final String EXCEPTION = “javax.servlet.jsp.jspException”;
public PageContext() {
}
public abstract void initialize(Servlet var1, ServletRequest var2, ServletResponse var3, String var4, boolean var5, int var6, boolean var7) throws IOException, IllegalStateException, IllegalArgumentException;
public abstract void release();
public abstract HttpSession getSession();
public abstract Object getPage();页面对象的当前值(在 Servlet 环境中,这是 javax.servlet.Servlet 的实例)。
public abstract ServletRequest getRequest();请求对象 (ServletRequest) 的当前值。
public abstract ServletResponse getResponse();响应对象 (ServletResponse) 的当前值。
public abstract Exception getException();
public abstract ServletConfig getServletConfig();
public abstract ServletContext getServletContext();
public abstract void forward(String var1) throws ServletException, IOException;
public abstract void include(String var1) throws ServletException, IOException;
public abstract void include(String var1, boolean var2) throws ServletException, IOException;
public abstract void handlePageException(Exception var1) throws ServletException, IOException;
public abstract void handlePageException(Throwable var1) throws ServletException, IOException;
public BodyContent pushBody() {
return null;
}
public ErrorData getErrorData() {
return new ErrorData((Throwable)this.getRequest().getAttribute(“javax.servlet.error.exception”), (Integer)this.getRequest().getAttribute(“javax.servlet.error.status_code”), (String)this.getRequest().getAttribute(“javax.servlet.error.request_uri”), (String)this.getRequest().getAttribute(“javax.servlet.error.servlet_name”));
}
}
```
JSP EL表达式
```
<%
request.setAttribute(“a”,”hello”)
%>
${a}
```
会在四大作用域中依次搜索a这个键名。
显示hello
变量定义使用`setAttribute()`方法进行设置,可以设置在`四大作用域`中的任意一个域中。
预定义11个对象
为了方便使用,定义了可以直接供我们使用的11个对象。
大多是都是用`Map`存储,采用键值对的形式。
* pageContext
* param
* paramValues
* header
* headerValues
* cookie
* initParam
* pageScope
* requestScope
* sessionScope
* applicationScope
**只有pageContext是PageContext类型。**
运算
- 取值
`.``[]`