JSP基础知识语法总结

之前也学习过一点java web的东西,但是一直没有搞清楚Servlet和JSP的关系。因为在Servlet中也有request和response等内置对象。其实一句话就可以总结什么是JSP(那就是在HTML中嵌入java代码)。我们都知道JSP 中有三大指令和九大内置对象。我们先说一下三大指令
分别是:
<%@page %>;常见属性
language;指定JSP页面使用的脚本语言,默认使用java。
import ;与java中的import关键字用法一样。
pageEncoding;指定JSP文件本身的编码方式(如果有中文,一般使用UTF-8)。
contentType;指定服务器发送给客户端的内容的编码方式,通常与pageEncoding保持一致。
当然还有一些属性,这里就不一一列举了。
<%@include %>
作用:包含指定的页面,在JSP文件编译成java文件之前把2个JSP文件合并,在编译成java文件。例如:
<%@include file=“页面” %>
<%@Taglib%>
用来在当前JSP页面导入第三方的标签库。一般指JSTL标签。关于三大指令就说这么多吧!
二、注释

可以用来注释html代码,但是要注意,该注释可通过客户端(浏览器)查看到。是不安全的。

<% //单行注释 %>
<% /* 多行注释 */%>
以上是java注释。<% %>中放置的是java代码,
<%-- jsp注释–%> JSP注释,如果想让注释不被浏览器看到,就可以使用JSP注释。
三、内置对象
什么是内置对象?其实就是可以先不用创建对象,直接可以拿来使用的对象,这就是内置对象。JSP中提供了9大内置对象,分别是:
pageContext : jsp页面容器
request : 客户端向服务器端发送的消息
response: 服务器端向客户端做出响应
session: 客户端与服务器端的一次会话
application:可存放全局变量,实现用户间的数据共享
config: 服务器配置信息,可以取得初始化参数
out: 向客户端输出内容
page: 当前JSP页面本身,类似于java类的this关键字
exception: 当一个页面在运行过程中发生异常,就会产生这个对象。

out:用于向客户端输出数据,最常用的就是out.print();需要注意的是,out.println()或者out.print("\n");均不能实现在客户端的换行功能。
request:主要用于存储"客户端发送给服务器端的消息",常用方法如下:
public String getParameter(String name):获取客户端发送给服务器的参数值。
public String[] getParameterValues(String name){}; 获取客户端发送给服务器端的参数值(这个主要用户表单提交时有复选框的情况)。
public void setCharacterEncoding(String env); 指定请求的编码,用于解决乱码问题。
public RequestDispatcher(String path); 返回一个RequestDispatcher对象,该对象的.forward()方法用于请求转发。
public HttpSession getSession(); 返回和请求相关的Session。
public ServletContext getServletContext(); 获取web应用的ServletContext对象。
例如,我们做一个简单的注册例子:
这是一个注册界面,名字为register.jsp
在这里插入图片描述
注册界面运行结果如下:
在这里插入图片描述
当我们点击注册按钮时,会提交到show.jsp界面。
在这里插入图片描述
show.jsp界面的结果如下:
在这里插入图片描述
我们接下来说一下get与post提交方式。当然不止这两种提交方式,还有其他的,常用的就是这两种。
区别:
1.地址栏不同。这里具体不赘述。大家可以自己观察。
如果以get方式提交实际就是通过URL 地址提交的方式向服务器发送数据。
备注:如果”URL地址传递“中的值是中文,而JSP页面编码是UTF-8时,则会显示乱码。原因是因为URL提交方式是get方法。而get方式的默认编码是ISO-8859-1,与JSP页面的UTF-8 编码不一致,所以导致了乱码的产生。解决的办法就是统一字符集编码。
1.将所有的JSP文件的编码设置为UTF-8 :
在这里插入图片描述
2.对于get和post实施不同的统一编码操作。
首先我们要知道Tomcat默认使用的编码方式是ISO-8859-1.
如果我们以get 方式提交表单(或者URL地址传递的方式),则处理编码的方式有以下两种:
a。分别把每个变量的编码方式从ISO-8859-1转换为UTF-8,具体如下;
在这里插入图片描述
b.修改Tomcat配置,一次性的将所有通过get方式传递的变量编码都设置了UTF-8(推荐),具体修改如下;打开Tomcat的conf目录,在server.xml的64行附近的元素中,加入 URLEncoding=“UTF-8”,如下:
在这里插入图片描述
从这里我们也可以看到,我们还可以修改端口,连接超时时间等。
备注:要使修改的Server.xml生效,就必须把Eclipse的Tomcat服务器设置成本地的Tomcat托管模式,设置方法如下:
双击Server面板下的Tomcat;
在这里插入图片描述
在双击打开的页面里,将ServerLocation指定为第二项,如下图:
在这里插入图片描述
之后,只要在Server项目中修改配置文件,修改结果就会同步到本地安装的Tomcat配置文件中。因此,如果要对Tomcat进行操作,只需要对Server项目进行操作。
注意:如果发现Server Location中的选项是灰色不可选的,则需要将现有的Tomcat从Server面板中删除,然后重新创建Tomcat服务后在选择。
如果以Post方式提交的数据,可以通过在服务器端加入;
request.setCharacterEncoding(“UTF-8”);
来设置编码。
JSP内置对象response,这个对象就要是给客户端做出相应。主要的方法有以下:
public void addCookie(Cookie cookie){}; 服务器向客户端增加cookie对象
public void sendRedirect(String location){}; 将客户端发过来的请求重新定位到另一个URL上。习惯上称重定向。
public void setContentType(String type){}; 设置服务器端响应的contentType类型。
首先,我们来了解一下重定向方法的使用;
例如:我们模拟实现一个登陆功能,用户输入用户名和密码,如果验证正确,则跳转到欢迎界面。
登录页面:login.jsp
在这里插入图片描述
验证界面:
在这里插入图片描述
登录成功提示界面:
在这里插入图片描述
运行结果:
在这里插入图片描述
从运行结果看,我们发现了一些问题;
1.用户名和密码验证成功,确实跳转到了欢迎界面,但数据确实丢失了,用户名为null。2.重定向到success.jsp后,地址栏也变成了success.jsp页面的地址了。
如何解决重定向后数据丢失的问题?
我们先来回顾一下,request中有一个public RequestDispatcher(String path)方法,该方法的返回对象.forward(request,response)和response.sendRedirect()方法有相同之处。都可以实现页面跳转。我们将验证界面的response.sendRedirect(“success.jsp”)换成request.getRequestDispatcher(“success.jsp”).forward(request,response);我们再来看一下结果:
在这里插入图片描述
采用请求转发方式,地址栏不会发生改变,也可以获取到客户端发送的表单数据。
关于请求转发和重定向:

请求转发重定向
请求服务器次数1次2次
是否保留第一次请求时request范围中的属性保留不保留
地址栏里的请求URL是否改变不变改变为重定向之后的新的URL

请求转发:
在这里插入图片描述
客户端向服务器资源A发起一次请求1,服务器资源A收到请求后,将该请求转发到内部的其他资源B2,资源B处理完以后,最终给客户端做出响应。
重定向:
在这里插入图片描述
客户端向服务器的资源A发起一次请求1,服务器资源A收到请求以后,给客户端做出响应,告诉客户端应该去重新访问资源B的地址2,客户端收到资源B的地址后再次想服务器的资源B发出第二次请求3,服务器的资源B处理完该请求并做出响应4。
Cookie 和JSP内置对象Session
Cookie 对象是由服务器端产生,在发送给客户端,并并且由浏览器将Cookie保存在客户端的某个文件中,也就是说,Cookie技术能将服务器端的一些数据保存在客户端,这样以来,用户下次直接可以通过自己的计算机来访问这些数据,因此,cookie技术可以提高网页处理的效率。也能减少服务器的负载。但是,也有缺点,由于Cookie技术是将服务器端的数据保存在客户端,所以安全性降低了很多。
cookie的常用方法:

方法简介
public Cookie(String name,String value)构造方法,用来实例化cookie对象,同时设置Cookie对象的属性值和属性名
public String getName()获取Cookie对象的名称
public String getValue()获取Cookie对象的内容
public void setMaxAge(int expiry)设置Cookie的保存时间,以秒为单位

服务器端可以通过response对象的addCookie()方法,将Cookie对象设置到客户端,否则,客户端是获取不到的。客户端可以通过request对象的getCookies()方法来获取全部的Cookie对象。
服务器端:response_addCookie.jsp
在这里插入图片描述
客户端:temp.jsp(再次跳转)
在这里插入图片描述
客户端:response_addCookie.jsp
在这里插入图片描述
我们在客户端通过可以获取cookie中保存的信息。(可以发现,我们在temp.jsp页面的超在这里插入代码片链接中并没有请求转发,而是采用了超链接,但是依然获取到了数据,这是因为,客户端发送的请求中,除了可以携带URL参数。表单数据外,还会传送丰富的请求头信息)。
Session对象。是JSP中的内置对象。
一个会话是指用户通过浏览器与服务器进行一系列的交互过程,交互期间可以包含浏览器与服务器之间的多次请求、响应。使用场景:

  1. 用户在浏览某个网站时,从进入网站到关闭这个网站所经过的这段时间,也就是用户浏览这个网站的整个过程,就是一个session。
  2. 在电子邮件中,从一个客户登陆到电子邮件系统开始,经过收信、写信和发信等一系列操作,直至最后推出邮件系统,整个过程也是一个Session。
    3.在购物网站应用中,从一个客户开始购物,到浏览商品、结算等,直至最后的结账,整个过程也是要给session。
    session的运行机制如下:
    当用户向web应用第一次发送请求时,服务器会创建一个session对象并分配给该用户,该session对象包含着一个唯一的标识符sessionid,并且服务器会在第一次响应用户时,将此sessionid作为jsessionid保存在浏览器的Cookie对象中,这个session将一直延续到用户访问结束。
    当web应用收到用户的请求时,首先会检查服务器是否已经为这个用户创建过session对象,具体就是判断用户的请求中是否包含了一个sessionid,如果包含,服务器就会通过这个session id找到对应的session,以确定是这个用户在访问服务器,如果用户亲求中没有sessionid,则服务器会创建一个新的session,并生成一个于此session对应的sessionid,然后将session id随着本次的响应返回给用户。
    说明:如果客户端禁用了Cookie,则服务器会自动使用URL-rewriting(URL重写,URL中包含了session id的信息)的技术来保存session id。
    说了这么多,总结一下session的运行机制:
    1.session是存储在服务器端的(在用户第一次请求时,由服务器创建并用来保存该用户的session id信息)。
    2.session是在多次请求间共享的,但多次请求必须是同一个客户端发起的。
    3.session的实现机制需要先发标记给客户端,在通过客户端发来的标记(jsessionid)找到对应的session。
    session的常用方法:
方法简介
public String getId()获取sessionid
public boolean isNew()判断是否是新的session用户
public void invalidate()使session失效
public void setAttribute(String name,Object value)设置session的对象名和对象值
public Object getAttribute(String name)根据session对象名,获取session对象值
public void setMaxInactiveInterval(int interval)设置session的有效非活动时间,单位是秒
public int geMaxInactiveInterval()获取session的有效非活动时间

接下来我们来验证一下session。创建一个登录及注销的例子:
实现思路:
用户首先进行登陆操作,如果登陆成功,则将用户的信息保存在一个session中,当用户在访问其他页面时,现在session范围内寻找是否存在用户的登陆信息,若存在,则表明用户已经登陆,是合法用户,反之,就是没有登录,从而直接跳转到登录页面进行登录,若用户登录成功,可以进行注销操作。
代码如下:
登录页面login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录Demo</title>
</head>
<body>
	<form action="check.jsp" method="post">
		用户名:<input type="text" name="user"/><br/>
		密码:<input type="password" name="pwd"/><br/>
		<input type="submit" value="登录"/>
	</form>
</body>
</html>

检查页面:check.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>检查登录</title>
</head>
<body>
	<%
		request.setCharacterEncoding("utf-8");
		String user = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		if(user.equals("admin") && pwd.equals("admin")){
			//登录成功以后,将用户名保存在Session中
			session.setAttribute("loginName",user);
			//设置session的非活动时间为 10分钟
			session.setMaxInactiveInterval(60*10);
			request.getRequestDispatcher("welcome.jsp").forward(request, response);
		}else{
			response.sendRedirect("login.jsp");
		}
	%>
</body>
</html>

登录成功欢迎界面:welcome.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登陆成功欢迎界面</title>
</head>
<body>
	<%
		String loginName = (String)session.getAttribute("loginName");
		if(loginName == null){
			response.sendRedirect("login.jsp");
		}else{
			out.print("登录成功!欢迎你<strong>"+loginName+"</strong><br/>");
			out.print("<a href='logout.jsp'>点我注销</a>");
		}
	%>

</body>
</html>

登录成功注销界面:logout.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>注销界面</title>
</head>
<body>
	<%
		//进入logout.jsp页面之前先通过session的作用域内判断用户是否已经登录
		//如果还没有登陆,则先跳转到登陆页面
		String loginName = (String)session.getAttribute("loginName");
		if(loginName == null){
			//用户还没有登陆
			response.sendRedirect("login.jsp");
		}else{
			//使session范围内的属性全部销毁,清除之前session中的loginName属性
			session.invalidate();
			response.sendRedirect("login.jsp");
		}
	%>
</body>
</html>

运行结果:
在这里插入图片描述
点击注销:
在这里插入图片描述
cookie与session的区别:

Cookiesession
保存信息的位置客户端服务器端
保存的内容字符串对象
安全性不安全安全

四种范围对象的作用域

对象作用域
pageContext数据只在当前自身的页面有效
request数据再一次请求中有效
Session数据在一次会话中有效,若是新开浏览器,则无效
application数据在当前web项目有效,可供所有用户共享

范围对象的常用方法:

方法说明
public void setAttribute(String name,Object o)设置属性名和属性值
public Object getAttribute(String name)根据属性名,获取对应的属性值
public void removeAttribute(String name)根据属性名,删除对应的属性值

JSP的基本语法就这些了,总结的可能不是很清楚,欢迎大家批评指正,现在已经过了十二点了,准确的说,java是1995年5月23日诞生的,昨天的他的生日,作为一个全栈工程师(在成为的路上),我们应该感到庆幸java这门强大的语言诞生。
就像今天电脑保护屏幕上弹出的一句话:

最初我们来到这个世界,是因为不得不来
最后我们离开这个世界,是因为不得不离

哎,人生在世,都不容易,就是要尝尽各种酸甜苦辣依然能够坚持最初的那份真情。加油吧!少年

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值