【J2EE笔记】2万字!我当时学习时做的笔记
0829
.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同步
如果同步访问同一数据
对共享数据的保护
用锁机制
并发:事件的发生没有因果关系
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转发后回来可以继续访问
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
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这个属性进行设置,不止客户端,换可以有转发等
REQUESTER
PORWORD
INCLUDE
@WebFilter
多Filtter顺序问题:
按从上到下顺序
url-Pattern 》 servlet-name
listener
事件处理模型
java.util.EventObject
protected source : Object
- getSource() :Object
edm
委托模型-事件处理模型
将事件交给听众
ServletContentListener
EventListener是空接口
public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1);
void contextDestroyed(ServletContextEvent var1);
}
ServletContextEvent
本质还是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中找到了这个方法
public interface HttpSessionListener extends EventListener {
void sessionCreated(HttpSessionEvent var1);
void sessionDestroyed(HttpSessionEvent var1);
}
ServletContext
属性监听器都是有 添加 , 移除, 替代的三个方法。
ServletContextAttributeListener
public interface ServletContextAttributeListener extends EventListener {
void attributeAdded(ServletContextAttributeEvent var1);
void attributeRemoved(ServletContextAttributeEvent var1);
void attributeReplaced(ServletContextAttributeEvent var1);
}
HttpSessionAttributeListener
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中配置,监听器就可以正常运行了。
<web-app>
<listener>
<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
1012
download struts framework
spring framework
/WEB-INF/lib
deploy front controller
web.xml
servlet, servlet-mapping
*.do
```
<selvlet>
<servlet-name>
<servlet-class>
<init-param>
<param-name>config
<param-value>/WEB-INF/struts/s.xml
```
struts2前端控制器使用filter,不使用servlet
<servlet-mapping>
<servlet-name>app
<url-pattern>/
spring 创建组件 根据id控制
ServletContextListener
contextInitialized等两个方法
<context-param>
<param-name>
<>param-value
<listener>
getServletConfig().getInitParameter("") : ServletConfig
getInitParamter() : servletContext
<beans>
这是在xml中启用注解的代码
<mvc:annotation-driven/>
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个
JSPWriter out
PageContext pa
ServletContext
参考
jsp也可以部署
jspEL隐含对象
大多是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/
mvc:annotation-driven/ - 组件类可以通过哪些注解声明?
@Controller @Service @Component @Repository
资料复习
- 异常分为几类,简单讲解一下。
java异常分为 运行时异常 和 编译时异常
运行时异常(RunTimeException)一般是程序员自己代码的问题,常见的有空指针异常(NullPointerException),除零产生的异常等。
编译时异常(CheckedException)是在编译阶段产生的异常,如关键字错误,括号不匹配等。
-
Servlet启动都经过哪些步骤?
Servlet是javaee的服务模块,通常其生命周期如下:
无参构造函数-》init初始化-》service调用服务-》destory销毁 -
https://www.bilibili.com/video/BV1J34y1u7xw/?spm_id_from=333.1007.tianma.1-1-1.click
这个网址的组成成分。
URI地址一般是由三部分构成:协议,域名,路径
对于上面的网址
https:代表使用https作为传输协议
www.bilibili.com:是域名
/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配置基本结构
省略结束符号
<xml version="1.0">
<web-app>
<servlet>
<servlet-name>
hello
<servlet-class>
com.example.HelloServlet
<servlet-mapping>
<servlet-name>
hello
<url-pattern>
/hello/a.html
<filter>
<filter-name>test</filter-name>
<filter-class>com.example.j2eetask5.filter.FilterChain</filter-class>
</filter>
<filter-mapping>
<filter-name>test</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.example.j2eetask5.ListenerTest</listener-class>
</listener>
-
HTTP的七种访问方法
GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE -
ServletContext 中
getContextPath
和getRealPath
的区别
getContextPath获取到相对路径,并且可以使用虚拟路径。
getRealPath获取到绝对路径,相对于盘符的路径。(绝对路径) -
dis ?我想干什么
-
我已经洞悉了JSP9大内置对象的实质!
在javax.servlet.jsp.PageContext
这个类中
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<String> getInitParameterNames();
}
- 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接口
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
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
的内容
重点先看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层的注解,用于标识功能和便于识别。
-
不,你看下图
-
参考
-
在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返回的是协议号
正如名字所示,获取协议,在一个网络请求中包括请求头和请求体,在请求头中有说明协议版本的字段。
一个说明字段是String很容易让人理解。
13. RqequestDispatcher 接受来自客户端的请求并将请求发送到服务器上任意位置
forward将请求从 Servlet 转发到服务器上的其他资源(Servlet、JSP 文件或 HTML 文件)。
include在响应中包含资源(servlet、JSP 页面、HTML 文件)的内容。
14. HttpSession
主要是getset Attribute的方法,还有获取时间相关,标识符等。
15. 注释
@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
<servlet>
<servlet-name>a<servlet-name/>
<jsp-file>/a.jsp<jsp-file/>
<servlet-mappiing>
<servlet-name>
<url-pattern>
<servlet/>
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);%>
或者
<jsp:declaration>
int i = 0;
<jsp:declaration/>
Jsp的action行为标签
9个隐式变量(内置变量)
HttpServletRequest request
HttpServletEesponse response
ServletContext application
PageContext pagecontext
ServletConfig config
HttpSession session
JspWriter out
Exception exception
page,等价于this
考试重点JspWriter,PageContext
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;
}
}
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类型。
运算
- 取值
.``[]
最后
你看到了这里,感谢你愿意看这些碎碎念,不成体系而且很随意的内容。
我们都是普通人咯,现在时间也不多了呢,但是未来到底如何还是迷雾一团啊,
我希望在今年能取得我自己满意的成绩啊,身边的同学都有自己的强势,我真的是孤身一人在打拼呢。哎,总感觉不是为自己而活,是为父母的期望而活,为了自己的后辈开路而活。
总会有悲伤的时候呢,别影响你了,加油。