JAVAEE之JSP

这里写图片描述

1、<% java代码 %>
解析后会放到service方法中;
3、JSP成员声明:作为类的成员;
4、JSP注释:不会在页面中显示的(解析根本不处理)
5、JSP三大指令标签

<%@ page %>
<%@taglib %>
<%@include %>:静态导入(将多个页面的内容先加载,再一起编译)
-----------------------------------------------------------------------------

动态导入:每一个页各自编译 ,在运行时再导入;

简介

index.jsp

<html>
 <head>
  <title>First Web Project</title>
 </head>
 <body>
  <%
   out.print("Hello World");
  %>
 </body>
</html>

其中<% out.print(“Hellow World”);%>称为脚本,可以发现,在JSP文件中,既有HTML标签,又有JAVA代码,因此我们可以把JSP看成嵌入JAVA的HTML代码

在Eclipse中生成Jsp内容,如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

Eclipse生成的JSP文件中,除了典型的html元素外,还有很多其他内容。这是因为JSP页面本身就可以包含多种页面元素,如脚本、HTML、指令、注释等。

JSP页面元素

所有嵌入在HTML中的JAVA代码都必须使用scriptlet包裹起来。在JSP中共有三种Scriptlet: <% … %>,<% !%>和<% =…%>
Scriptlet一般写在标签中

第一种Scriptlet:<%…%>

<%…%>主要用来定义局部变量,编写java语句,如下代码所示
jspDemo1.jsp

<%
   String bookName ="JAVA EE测试";
   String author = "ZY" ;
   out.print("书名:"+bookName+"<br/>作者:"+author);
    %>

第二种Scriptlet: <%!…%>

<%!…%>主要用来定义全局变量、定义方法
jspDemo2.jsp

<%!
      public String bookName ;
         public String author ;
         public void initInfo()
         {
           bookName ="JAVA EE测试";
   author = "LZY" ;
         }
     %>
     <% 
       inintInfo();
       out.print("书名:"+bookName+"&lt;br/&gt;作者:"+author);
    %>

第三种Scriptlet: <%= …%>

<%=..%>用来输出=后面的表达式的值,功能类似out.print()
jspDemo3.jsp

  String bookName ="JAVA EE测试";
  String author = "LZY" ;
   %>

   <%="书名:"+bookName+"<br/>作者:"+author%>
   <!--等价于out.print("书名:"+bookName+"<br/>作者:"+author); -->

out.print()和<%=…>不仅能输出变量,还可解析”<br/>”等html代码,需要注意,<%=…>中没有“;”。

指令

jsp指令写在<%@ …%>中,如下代码所示:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

以上代码称之为page指令,page指令可以用来设置当前JSP文件的一些属性,常见属性如下表:

属性说明
language指定JSP页面使用的脚本语言,默认是Java,一般不用修改
import与java中import的用法一致,可以执行导包操作
pageEncoding指定JSP文件本身的编码方式
contentType指定服务器发送给客户端的内容的编码方式,通常与pageEncoding保持一致

jspDemo4.jsp

<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
<html>
     <head>
     <title>Insert title here</title>
 </head>
  <body>
   <%
   Date date = new Date();
     out.print(date);
   %>
  </body>
</html>

以上代码,通过import导入java.util.Date,并指定了编码方式为UTF-8
JSP指令:http://www.runoob.com/jsp/jsp-directives.html

注释

注释方式说明
HTML注释。可以用来注释HTML代码,但是注意此种注释能通过客户端(浏览器)查看到,因此是不安全的
<%– –%>JSP注释,如果想让注释不被浏览器`
<%//单行注释%><%/多行注释/%>JAVA注释:<% %>中放置的是java代码,所以可以在<% %>使用//和/../来对其中的JAVA代码进行注释

jspDemo5.jsp

<html>
 <head>
      <title>Insert title here</title>
      </head>
  <body>
   <!-- html注释 -->
   <%-- jsp注释 --%>
     <%
   //java单行注释
   /*
               java多行注释
            */
      %>
  </body>
</html>

内置对象

<%
out.print("Hello World");
%>

没有定义和实例化(new)就可以直接使用的对象,就称为内置对象。除了out以外,JSP还提供了其他的一些内置对象

内置对象类型简介
1.pageContextjavax.servelet.jsp.PageContextJSP页面容器
2.requestjavax.servlet.http.HttpServletRequest客户端向服务端发送的请求信息
3.responsejavax.servlet.http.HttpServletResponse服务器端向客户端的响应信息
4.sessionjavax.servlet.http.HttpSession客户端与服务端的一次会话
5.applicationjavax.servlet.ServletContext可存放全局变量,实现用户间数据的共享
6.configjavax.servlet.ServletConfig服务器配置信息,可以取得初始化参数
7.outjavax.servlet.jsp.JspWriter向客户端输出内容
8.pagejava.lang.Object当前JSP页面本身,类似于Java中的this关键字
9.exceptionjava.lang.Throwable当一个页面在运行过程中发生了异常,就产生这个对象

常用内置对象及cookie

jsp内置对象out

out用于向客户端输出数据,最常用的是out.print();需要注意的是, out.println() 或者 out.print(“\n”) 均不能实现在客户端的换行功能。
若要实现换行,必须借助于HTML的<br/>标签。

JSP内置对象request

1.request简介
request对象主要用于存储“客户端发送给服务器的请求信息”。
这里写图片描述
通过request对象来获取用户发送的相关数据,request对象的常用方法如下:

方法简介
public String getParameter(String name)获取客户端发送给服务端的参数值(由name指定的唯一参数值,如单选框、密码框的值)
public String[] getParameterValues(String name)获取客户端发送给服务端的参数值(由name指定的多个参数值,如复选框的值)
public void setCharacterEncoding(String env)指定请求编码,用于解决乱码的问题
public RequestDispatcher getRequestDispatcher(String path)返回RequestDispatcher对象,该对象的foward()方法用于转发请求
public HttpSession getSession()返回和请求相关Session
public ServletContext getServletContext()获取web应用的ServletContext对象

注册 register.jsp

<html>
…
 <body>
  <form action="show.jsp" method="post" >
   用户名:<input type="text" name="uname" /><br/>
   密码:<input type="password" name="upwd" /><br/>
   兴趣:<br/>
    足球<input type="checkbox" name="hobby" value="足球"/> 
    篮球<input type="checkbox" name="hobby" value="篮球"/> 
    羽毛球<input type="checkbox" name="hobby"  value="羽毛球"/>          <br/>
   <input type="submit" value="注册" /> 
  </form>
 </body>
</html>

show.jsp

<html><body>
  <%
   //将请求的编码与页面保持一致,设置为UTF-8
   request.setCharacterEncoding("UTF-8");
   //获取表单中name值为"uname"元素的value值
   String name = request.getParameter("uname");
   //获取表单中name值为"upwd"元素的value值
   String pwd = request.getParameter("upwd");
   //获取表单中,已选name值为"hobby"元素的value数组值
   String[] hobbies = request.getParameterValues("hobby");
  %>
  您注册的信息如下:<br/>
  用户名:<%=name %> <br/>
  密码:<%=pwd %> <br/>
  爱好:
    <%
       if(hobbies != null) 
       {
         for(int i=0 ; i<hobbies.length ;i++)
         {
          out.print(hobbies[i]+"&nbsp");
         }
       }   
 %>
 </body>
</html>

通过request.setCharacterEncoding(“UTF-8”)将POST方式的编码设置为UTF-8,,并通过request.getParameter()和request.getParameterValues()方法获取到了从表单传来的数据。
需要注意的是,客户端的数据不一定必须从表单传递过来,也可以通过URL地址进行传递,格式如下:
     页面地址?参数名1=参数内容1&参数名2=参数内容2&…
即通过“?”将页面地址和参数分离,然后按照“参数名=参数内容”的格式来传递数据,并且多个参数之间用“&”分隔。

get方式提交表单,实际就是通过URL地址提交的方式向服务器端发送数据。

如果 “URL地址传递”中的值是中文,而JSP页面编码是UTF-8时,则会显示乱码。原因是“URL地址传递”使用的是GET方式传递数据,而GET方式的默认编码是ISO-8859-1,与JSP页面编码UTF-8不一致。解决方法就是将GET方式提交的数据,进行统一字符编码。

统一字符集编码

将所有JSP文件的编码设置为UTF-8

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html;
 charset=UTF-8">

2.对于GET或POST方式,实施不同的统一编码操作。

我们首先要知道tomcat服务器,默认使用的编码方式是ISO-8859-1。
(1)如果是以get方式提交表单(或URL地址传递的方式),则有两种方式处理编码:
①分别把每一个变量的编码方式,从ISO-8859-1转为UTF-8

 //将name的编码方式,从ISO-8859-1转为UTF-8
 String name = request.getParameter("uname");
            name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
            //将pwd的编码方式,从ISO-8859-1转为UTF-8
            String pwd = request.getParameter("upwd");
            pwd = new String(pwd.getBytes("ISO-8859-1"), "UTF-8");

②修改tomcat配置,一次性的,将所有通过get方式传递的变量编码都设置为UTF-8(推荐)。具体修改如下:打开tomcat的conf目录,在server.xml的64行附近的元素中,加入URIEncoding=”UTF-8”,如下,

server.xml

<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"  URIEncoding="UTF-8" />

说明:

要使修改的server.xml生效,必须把Eclipse的tomat服务器设置成本地Tomcat托管模式,设置方法如下:

我们使用Eclipse配置完Tomcat后,会在左侧项目导航栏多出一个Servers项目,该项目中就有Tomcat的一些配置文件,如context.xml,server.xml等。为了使Servers项目中的配置文件,与我们本地安装的Tomcat目录中的配置文件保持一致,我们可以双击控制台Servers下的Tomcat V8.0…

如果是以post方式提交表单,可以通过在服务器端加入request.setCharacterEncoding(“UTF-8”)来设置编码。

1.response简介
这里写图片描述

方法简介
public void addCookie(Cookie cookie)服务端向客户端增加Cookie对象
public void sendRedirect(String location) throws IOException将客户端发来的请求,重新定位(跳转)到另一个URL上(习惯上称为“重定向”)
public void setContentType(String type)设置服务器端响应的contentType类型

login.jsp

<html><body>
  <form action="check.jsp" method="post" >
   用户名:<input type="text" name="uname" /><br/>
   密码:<input type="password" name="upwd" /><br/>
   <input type="submit" value="登陆" /> 
  </form>
 </body>
</html>

check.jsp

<html><body>
  <%
   request.setCharacterEncoding("UTF-8");
   String name = request.getParameter("uname");
   String pwd = request.getParameter("upwd");
   //假设用户为名“张三”且密码为“abc”时,登陆验证成功
   if(name.equals("张三") && pwd.equals("abc"))
   {
             //若验证成功,则重定向到success.jsp页面
    response.sendRedirect("success.jsp");
   }
  %>
 </body>
</html>

success.jsp

<html><body>
  登陆成功!<br/>
  欢迎您:<br/>
  <%
   String name = request.getParameter("uname");
   out.print(name);
  %>
 </body>
</html>

1.如果用户名和密码验证成功,确实跳转到了欢迎页success.jsp,但数据却丢失了,用户名name的值为null。
2.重定向到success.jsp后,地址栏也变成了success.jsp页面的地址。

请求转发与重定向

为了解决重定向以后数据丢失的问题,我们先来回忆一下request对象中的一个方法: public RequestDispatcher getRequestDispatcher(String path)

之前说过,此方法的返回值RequestDispatcher对象,有一个forward()方法可以用于转发请求,也就是说,request的getRequestDispatcher()方法和response的sendRedirect()方法有相同之处:都可以实现页面之间的跳转。

请求转发(forward())重定向(redirect())
请求服务器次数1次
是否保留第一次请求到的request范围中的属性保留
地址栏里的请求URL,是否改变不变

这里写图片描述

重定向:客户端(浏览器)向服务器的资源A发起一次请求①,服务器的资源A接收到该请求后,给客户端做出响应,告诉客户端去重新访问资源B的地址 ②,客户端收到资源B的地址后再次向服务器的资源B发出第二次请求③,服务器资源B处理完该请求并做出响应④
这里写图片描述

cookie和JSP内置对象session

cookie对象是先由服务端产生,再发送给客户端(浏览器)的,并且浏览器会将该cookie保存在客户端的某个文件中。也就是说,cookie技术能将服务器端的一些数据,保存在用户使用的客户端计算机中。这样一来,用户下次就可以直接通过自己的计算机访问到该数据,而不必再访问服务器。因而cookie技术可以提高网页处理的效率,也能减少服务器端的负载。但是由于cookie是服务器端保存在客户端的信息,所以其安全性相对较差。

cookie的使用
一个Cookie对象包含一个键值对,即key=value。cookie不是JSP的内置对象,需要通过JSP提供的javax.servlet.http.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对象。
在客户端每一次访问服务器时,服务器为了区分各个不同的客户端,就会自动在每个客户端的Cookie里设置一个JSESSIONID,表示该客户端的唯一标示符。

session

session通常被翻译成“会话”。一个会话是指:用户通过浏览器(客户端)与服务器之间进行的一系列的交互过程,交互期间可以包含浏览器与服务器之间的多次请求、响应。以下是3个常见的session使用情景:
①用户在浏览某个网站时,从进入网站到关闭这个网站所经过的这段时间,也就是用户浏览这个网站的整个过程,就是一个session。
②在电子邮件应用中,从一个客户登录到电子邮件系统开始,经过收信、写信和发信等一系列操作,直至最后退出邮件系统,整个过程为一个session。
③在购物网站应用中,从一个客户开始购物,到浏览商品、结算等,直至最后的结账,整个过程为一个session。

session运行机制:当用户(浏览器)向Web应用第一次发送请求时,服务器会创建一个session对象并分配给该用户;该session对象中包含着一个唯一标识符sessionId,并且服务器会在第一次响应用户时,将此sessionId作为jsessionid保存在浏览器的Cookie对象中;这个session将一直延续到用户访问结束(浏览器关闭或用户长时间不访问Web应用)。

当Web应用接收到用户的请求时,首先会检查服务器是否已经为这个用户(浏览器)创建过了session对象,具体是判断用户的请求中是否包含了一个sessionId,如果包含sessionId,则服务器就会通过这个sessionId找到对应的session,以确定是这个用户在访问服务器。而如果用户的请求中没有sessionId,服务器会为该用户创建一个新的session,并生成一个与此session对应的sessionId,然后将sessionId随着本次响应返回给用户(浏览器的Cookie对象中)
这里写图片描述

说明:如果客户端禁用了Cookie,则服务器会自动使用URL-rewriting(URL重写,URL中包含session ID的信息)的技术来保存sessionId。

①session是存储在服务端的(在用户第一次请求时,由服务器会创建并用来保存该用户的sessionId等信息)

②Session是在多次请求间共享的,但多次请求必须是同一个客户端发起的(例如,同一个用户进行的购物操作)

③Session的实现机制需要先发标识给客户端,再通过客户端发来的标识(jsessionid)找到对应的session

session内置对象是javax.servlet.ServletContext.HttpSession接口的实例化对象

方法简介
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 getMaxInactiveInterval()获取session的有效非活动时间,单位是秒

cookie和session

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

JSP内置对象application

application对象是javax.servlet.ServletContext接口的实例化对象,代表了整个web项目,所以application对象的数据可以在整个web项目中共享,用法上类似于“全局变量”的概念

方法简介
public String getContextPath()获取虚拟路径(默认是项目名称)
public String getRealPath(String path)获取虚拟路径对应的绝对路径

四种范围对象的作用域

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

都存在以下表格中的方法:

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

四种作用域的大小依次是pageContext

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值