JSP(Java Server Pages)是一种动态网页技术,它允许开发人员在HTML页面中嵌入Java代码,以便在服务器上生成动态内容。在JSP中,有一些内置对象,这些对象提供了许多有用的功能,使得开发人员可以更轻松地处理请求和响应,以及访问Web应用程序的各个部分。在本文中,我将总结JSP内置对象的学习经验和知识。
首先,我们需要了解JSP中的内置对象有哪些。在JSP中,有9个内置对象,它们分别是:request、response、out、session、application、config、pageContext、page和exception。这些内置对象提供了各种功能,例如访问请求参数、设置响应头、输出HTML内容、管理会话、访问应用程序范围的属性等等。
目录
•request对象
获取用户提交的信息
用户通常使用HTML的form表单:
<form action= "请求访问的页面或Servlet" method= get | post >
提交手段
</form>
例如:
<form action="tom.jsp" method= "post" >
<input type="text" name="boy" value= "ok" />
<input type="submit" name="submit" value="提交"/>
</form>
通过表单向example4_1_computer.jsp提交三角形三边的长度,example4_1_computer.jsp负责计算并显示三角形的面积。
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor = #ccffff>
<p style="font-family:黑体;font-size:36;color:blue">
<%
String sideA=request.getParameter("sizeA");
String sideB=request.getParameter("sizeB");
String sideC=request.getParameter("sizeC");
try { double a=Double.parseDouble(sideA);
double b=Double.parseDouble(sideB);
double c=Double.parseDouble(sideC);
double p=(a+b+c)/2,area=0;
area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
String result = String.format("%.2f",area);
out.println("<BR>三边:"+sideA+","+sideB+","+sideC);
out.println("<BR>三角形面积(保留2位小数):"+result);
}
catch(NumberFormatException ee){
out.println("<BR>请输入数字字符");
}
%>
</p></body></HTML>
结果:
request对象获取用户提交信息的最常用的方法是getParameter(String s)
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.util.regex.Pattern" %>
<%@ page import="java.util.regex.Matcher" %>
<style>
#tom{
font-family:宋体;font-size:22;color:blue
}
</style>
<HTML><body id ="tom" bgcolor = #ffccff>
输入购物小票内容(显示的是默认内容):
<%
String content = "牛奶:12.68元,面包:6.6元,"
+"苹果:28元,香皂:6.58元";
%>
<form action ="" method="post" id ="tom">
<textArea name="shopping" rows=5 cols=32 id ="tom">
<%= content %>
</textArea>
<input type="submit" id ="tom" name="submit" value="提交"/>
</form>
<% String shoppingReceipt=request.getParameter("shopping");
if(shoppingReceipt==null) {
shoppingReceipt="0";
}
Pattern pattern; //模式对象
Matcher matcher; //匹配对象
String regex="-?[0-9][0-9]*[.]?[0-9]*" ;//匹配数字,整数或浮点数的正则表达式。
pattern = Pattern.compile(regex); //初试化模式对象。
matcher =
pattern.matcher(shoppingReceipt); //matcher检索shoppingReceipt。
double sum = 0;
while(matcher.find()) {
String str = matcher.group();
sum += Double.parseDouble(str);
}
out.print("购物小票消费总额:"+sum);
%>
</body></HTML>
结果:
处理汉字信息
通过表单向自己提交不同语言的问候语,内置对象request在获取信息之前调用setCharacterEncoding方法设置编码为utf-8,然后再获取数据。
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#tom{
font-family:宋体;font-size:26;color:blue
}
</style>
<HTML><body id="tom" bgcolor = #ffccff>
可以输入各种语言的文字,单击提交键:
<%
String content = "早上好,Good morning,อรุณสวัสดิ์ค่ะ(泰语),"+
" おはよう,Доброе утро,좋은 아침";
%>
<form action="" method='post' >
<textArea name="language" id="tom" rows=3 cols=50>
<%= content %>
</textArea>
<input type="submit" id="tom" name="submit" value="提交"/>
</form>
<% request.setCharacterEncoding("utf-8");
String variousLanguages=request.getParameter("language");
out.print(variousLanguages);
%>
</p></body></HTML>
结果:
处理HTML标记(不区分大小写)
<%@ page import="java.time.LocalDate" %>
<%@ page import="java.time.DayOfWeek" %>
<%
request.setCharacterEncoding("utf-8");
String year=request.getParameter("year");
String month=request.getParameter("month");
int y = Integer.parseInt(year);
int m = Integer.parseInt(month);
LocalDate date = LocalDate.of(y,m,1);
int days = date.lengthOfMonth(); //得到该月有多少天。
int space = 0; //存放空白字符的个数
DayOfWeek dayOfWeek = date.getDayOfWeek(); //得到1号是星期几
switch(dayOfWeek) {
case SUNDAY: space = 0;
break;
case MONDAY: space = 1;
break;
case TUESDAY: space = 2;
break;
case WEDNESDAY: space = 3;
break;
case THURSDAY: space = 4;
break;
case FRIDAY: space = 5;
break;
case SATURDAY: space = 6;
break;
}
String [] calendar = new String[space+days]; //用于存放日期和1号前面的空白
for(int i=0;i<space;i++)
calendar[i]="--";
for(int i = space,n=1;i<calendar.length;i++){
calendar[i] = String.valueOf(n) ;
n++;
}
%>
<HTML><body bgcolor = #ffccff>
<h3> <%=year %>年<%=month %>月的日历:</h3>
<table border=0>
<tr><th>星期日</th><th>星期一</th><th>星期二</th><th>星期三</th>
<th>星期四</th><th>星期五</th><th>星期六</th>
</tr>
<%
int n = 0;
while(n<calendar.length){
out.print("<tr>");
int increment = Math.min(7,calendar.length-n);
for(int i=n;i<n+increment;i++) {
out.print("<td align= center>"+calendar[i]+"</td>");
}
out.print("</tr>");
n = n+increment;
}
%>
</table></body></HTML>
结果:
•response对象
动态响应contentType属性
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="java.awt.geom.*" %>
<%@ page import="javax.imageio.ImageIO" %>
<style>#textStyle
{ font-family:宋体;font-size:36;color:blue
}
</style>
<%! void drawCircle(double r,HttpServletResponse response) { //定义绘制圆的方法
int width=320, height=300;
BufferedImage image =
new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.fillRect(0, 0, width, height);
Graphics2D g_2d=(Graphics2D)g;
Ellipse2D ellipse=new Ellipse2D.Double(160-r,150-r,2*r,2*r);
g_2d.setColor(Color.blue);
g_2d.draw(ellipse);
try {
OutputStream outClient= response.getOutputStream();//指向用户端的输出流
boolean boo =ImageIO.write(image,"jpeg",outClient);
}
catch(Exception exp){}
}
double getArea(double r) { //定义求面积的方法
return Math.PI*r*r;
}
%>
<% request.setCharacterEncoding("utf-8");
String submitValue = request.getParameter("submit");
String radius = request.getParameter("radius");
double r =Double.parseDouble(radius);
if(submitValue.equals("提交看圆形")){
response.setContentType("image/jpeg");//response更改相应用户的MIME类型
drawCircle(r,response) ; //绘制圆
}
%>
<HTML><body bgcolor = #EEEEFF>
<p id ="textStyle">
<%
double area=getArea(r);
String result = String.format("%.2f",area);
%>
半径:<%= radius %><br>
<b>面积(保留2位小数)<br><%= result %>
</p></body></HTML>
结果:
response重定向
response的sendRedirect(URL url)方法实现用户的重定向,即让用户从一个页面跳转到sendRedirect(URL: url)中url指定的页面。
■当使用sendRedirect(URL url)方法将用户从当前页面重定向另一个页面时,Tomcat服务器还是要把当前JSP页面执行完毕后才实施重定向(跳转)操作,但Tomcat服务器不再给用户看当前页面的执行效果。
■如果在执行sendRedirect(URL url)方法后,紧接着执行了return返回语句,那么Tomcat服务器会立刻结束当前JSP页面的执行。
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
{ font-family:宋体;font-size:36;color:blue
}
</style>
<HTML><body bgcolor=#ffccff>
<p id="textStyle">
填写姓名(<%= (String)session.getAttribute("name")%>):<br>
<form action="example4_12_receive.jsp" method="post" name=form>
<input type="text" id="textStyle" name="name">
<input type="submit" id="textStyle" value="确定"/>
</form>
</body></HTML>
session对象
这节学习了session对象,用户第一次访问Web服务目录时,Tomcat服务器创建和该用户相对应的session对象,当用户在所访问的Web服务目录的各个页面之间浏览时,这个session对象都是同一个,而且不同用户的session对象是互不相同的。本节学习的application对象也是由Tomcat服务器负责创建,但与session对象不同的是,application对象被访问该Web服务目录的所有的用户共享,但不同Web服务目录下的application互不相同。
Tomcat服务器可以使用内置session对象(会话)记录用户的信息。内置对象session由Tomcat服务器负责创建
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>#textStyle
{ font-family:黑体;font-size:36;color:red
}
</style>
<HTML><body bgcolor=cyan>
<p id="textStyle">
这是example4_13_b.jsp页面
<% String id=session.getId();
out.println("<br>session对象的ID是<br>"+id);
%>
<br>连接到example4_13_a.jsp的页面。<br>
<a href="example4_13_a.jsp">example4_13_a.jsp</a>
</body></HTML>
结果:
session对象使用setMaxInactiveInterval(int interval)方法设置最长的“发呆”状态时间为6秒。用户可以通过刷新页面检查是否达到了最长的“发呆”时间,如果两次刷新之间的间隔超过6秒,用户先前的session将被取消,用户将获得一个新的session对象。
<%@ page import="java.time.LocalTime" %>
<%@ page import="java.time.temporal.ChronoUnit" %>
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor = #ffccff>
<% out.println("session的Id:"+session.getId());
session.setMaxInactiveInterval(6);
LocalTime time = LocalTime.now();
out.print("<br>(时:分:秒:纳秒)"+time);
out.println("<br>开始发呆");
%>
</body></HTML>
结果:
•application对象
(1)public void setAttribute(String key ,Object obj)。application对象可以调用该方法将参数Object 指定的对象 obj添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
(2)public Object getAttibute(String key)。获取application对象含有的关键字是key的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应显式转化为原来的类型。
•out对象
out对象是一个输出流,用来向用户端输出数据。在前面的许多例子里曾多次使用out对象进行数据的输出。out对象可调用如下的方法用于各种数据的输出,
例如:
out.print(boolean)或out.println(boolean) 用于输出一个布尔值。
out.print(char) 或out.println(char) 输出一个字符。
out.print(double) 或out.println(double)输出一个双精度的浮点数。
out.print(fload) 或out.println(float)用于输出一个单精度的浮点数。
out.print(long) 或out.println(long)输出一个长整型数据。
out.print(String) 或out.println(String)输出一个String对象的字符序列。
方法println和print的区别是:println会向缓存区写入一个换行,而print不写入换行。但是浏览器的显示区域目前不识别println写入的换行,如果希望浏览器显示换行,应当向浏览器写入"<br>"实现换行。
以上就是对jsp内置对象的学习,JSP内置对象是JSP技术中非常重要的组成部分,它们提供了一些常用的Java对象,使得开发者可以方便地使用这些对象来完成网页的开发。通过学习JSP内置对象,开发者可以更好地掌握JSP技术,从而实现更加高效和灵活的网页开发。