JavaWeb中JSP和Servlet的相关知识

JSP注释代码:<%–(包围)–%>
引入JAVA包(举例):<%page import ‘java.util.*’%>
JSP中的JAVA代码块:
<%(包围)%> 在此代码块中可以定义变量和方法,定义的变量为局部变量
<%!(包围)%> 定义表达式,只能定义变量,且定义的变量为成员变量
<%=(包围)%> 输出表达式,直接向网页显示包含内容的value

局部变量:执行 JSP时,系统都自动给运行的JSP 生成一个类,写在<%%>块里的代码会被当成一个方法生成,在java中,方法中定义的变量在方法结束后就销毁了,所以在<%%>中定义的变量都是局部变量

成员变量:同上系统会为jsp生成一个java类,写在<!%%>中的代码对应生成的是java类中成员变量,只会在对象创建时初始化,再次访问对象不会再次初始化
jsp中最常用的内置对象request和response:

request: 接收并处理从客户端发送过来的请求包,request对象的方法都是对客户端发送过来的信息进行信息提取
处理客户端发送的数据

response: 向客户端发送响应包,可以直接向客户端(浏览器)发出操作指令,例如页面跳转(相当于自动在浏览器地址栏输入URL回车)
给客户端发送数据

请求转跳(服务器转跳):

在客户端,也就是浏览器发送依次请求时,服务端都会新建一个request和response对象,每次请求所生成的对象都是新的,只要有新的请求出现,保存在原request对象中的数据就会丢失,比如使用request.setAttribute保存的信息就无法保存下来,除非使用request的请求跳转(getRequestDispatcher),把当前页面的request和response对象传送给新的页面,就可以保存对象里的信息了
示例:

request.getRequestDispatcher("xxx.jsp").forward(request,response);

相当于发送给原页面的信息被该页面传递给一个新的页面,新的页面不需要重新创建request和response对象,可以保证客户端发送的请求信息不丢失(例如表单信息)但是客户端(浏览器)并不会地址栏不会显示新的网址,因为没有使用到response对象进行操作,不能直接控制客户端浏览器使用response对象可以操作地址栏URL(请求重定向)

在使用请求跳转时,有时一些静态资源(css,js)的访问使用的是相对路径,由于转跳后浏览器的地址不会跟随服务器改变,若使用相对路径,就会在转跳之前的地址上查找资源,资源就可能找不到,所以如果有使用服务器转跳,资源访问推荐使用绝对路径(动态获取的绝对路径):

request.getContextPath()+/...//获得当前路径加上文件名称即可使用绝对路径定位到资源

而服务器端路径使用绝对路径很少会有问题,

请求重定向(客户端转跳):
response.sendRedirect("xxx.jsp");

相当于直接在URL地址输入信息再回车发起请求,只不过这个过程由服务器来控制自动完成,其他没有区别

注意页面转跳之后就不再执行原页面的代码了

服务器端绝对路径和客户端绝对路径(“/”)的区别:
服务器端会识别项目名,所以根目录包含项目名:
例如:https://localhost:8080/web01/
但是客户端不会识别项目名,只会把项目识别成一个路径名称,所以客户端的根目录为:
例如:http://localhost:8080/

如何区分这两个路径?
如果可以是写在html标准的标签里,例如a标签的href属性,那就是客户端路径,如果是写在java代码里,表示的就是服务器路径,可以通过添加el表达式保证客户端和服务器地址一致。

session:
在现实中,每个服务器都要服务多个客户端的,同一个客户端可能多次发起请求时,服务器就会给这些请求统一创建一个session(一个客户端只有一个session),直到离开网页(如果session不活跃,一段时间后session会被服务器销毁,需要时重新创建),所有的jsp都可以访问到(所有的请求合起来称为会话)

application:
比session更高一级,代表整个网页,不管由多少台客户端,application只有一个,不适合数据传输,适合保存全局信息

(不常用)page:
表示当前页面,不能实现数据在页面之间的转化,一个页面对应一个page对象,在JSP的页面中,page和this是等价的,功能不多。
(不常用)pageContext:
页面上下文对象,可以使用它获取request、response、session、application对象:
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
pageContext.getServletContext();
也可以存对象到指定的域(request、response、session、application):
pageContext.setAttribute();
但是使用比较繁琐,且对象一般都不需要获取就可以使用,所以很少使用

servlet:
在jsp里可以直接处理业务逻辑,但是java代码和html代码混在一起,且处理业务逻辑时不需要展示,所以html代码就比较多余,这时可以使用servlet进行业务处理,使用注释@WebServlet("/xxxx")标记访问路径,覆写doPost和doGet方法,在这两个方法里会提供request和response对象,可以像在jsp里操作的一样,如果需要使用application,可以使用this.getServletContext()获取application,在JSP编译后期实际上也是编译成servlet,如果需要使用session,就不可以直接使用this,需要使用request.getSession(),因为application是和服务器绑定的,而session是一个客户端就有一个session,所以需要从客户端的信息中找到session。

servlet生命周期:
当有客户端访问时,servlet会初始化,servlet初始化会调用init(),当有新的客户端访问时,不再调用initial()方法。当客户端发起请求时,会先调用service方法,然后调用对应的doGet和doPost,当服务器重启或关闭时,会调用destroy方法

设置编码:
除了在JSP头部设置encoding,还可以使用request.setCharacterEncoding(“utf-8”);来设置编码格式,比写传统java编码转换代码简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值