JavaEE(三):JSP_jsp用gbk servlet 用什么编码-程序员宅基地

技术标签: JavaEE  

一、JSP简介

    JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。JSP其实是一种特殊的Servlet,当jsp页面第一次被访问时,服务器会把jsp编译成java文件。

二、JSP页面组成

静态内容 HTML静态文本
指令 以“<%@”开始,以"%>"结束。
比如:<%@include file="Filename" %>
动作标签 以"<jsp:action_name>"以“</jsp:action_name>”结束

比如:<jsp:include page=""></jsp:include>

表达式 <%=Java表达式>
小脚本 <%Java代码%>
声明 <%!方法%>
注释 <!--这是HTML注释,但客户端可以查看到-->
<%--这也是注释,但客户端查不到--%>

三、三大指令

1、page:说明jsp的页面情况

<%@ page language=”java” import=”java.util.*,java.text.*” contentType=”text/html; charset=GBK” %>

    language=”java”:使用那种语言,目前只支持JAVA。

    import=””:相当于导包。

    contentType=””:内容类型,是一种什么页面,HTML页面。

    charset=GBK:编码类型。

    pageEncoding=”GBK” 与 charset=”GBK” 的编码要一致。

    UTF-8编码支持多国语言。

    支持中文的的编码:GBK、GB2312、GB18030。

    JSP默认编码:ISO-8859-1

    JAVA默认编码:unicode

2、include:包含一个页面

3、taglib:引入标签库文件

<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法<s:text>

prefix:指定标签库在本页面中的前缀!由我们自己来起名称! 
uri: 指定标签库的位置! 

四、九大内置对象

对象名
类型
说明
request
javax.servlet.http.HttpServletRequest
 
response
javax.servlet.http.HttpServletResponse
 
session
javax.servlet.http.HttpSession
由session="true"开关
application
javax.servlet.ServletContext
 
exception
java.lang.Throwable
由isErrorPage="false"开关
page
java.lang.Object当前对象this
当前servlet实例
config
javax.servlet.ServletConfig
 
out
 javax.servlet.jsp.JspWriter
字符输出流,相当于 printWriter对象
pageContext
 javax.servlet.jsp.PageContext
 

request:获取页面传来的参数信息

response:获取页面传来的参数后,后台做出相应,返回给客户端数据

session:每个客户打开一个浏览器,就会创建一个会话,并直到页面关闭是一个完整的会话

application服务器启动就建立了一个application对象,一个服务器所有的客户都是同一个application对象.

out:是一个输出流,用来向客户端输出数据,可以是任何形式的,类似java后台代码的system.out.println(),可以直接打印输出语句.

page:是当前页面转换成servlet类的实例,多用在后台代码中

config:jsp的配置信息,多用在servlet类实例中

exception:页面处理过程中的报错信息

pagecontext:是上下文属性对象,即获取当前页面的属性,通过此对象可以获得其他八大对象

五、动作标签

动作标签是由tomcat(服务器)来解释执行!而html标签由浏览器来执行!

  • <jsp:include> 
    例如:<jsp:include page="xxx"/>,用来包含指定的页面。假如有两个jsp. 分别为a.jsp和b.jsp,他们分别编码成Servlet,然后在执行Servlet时才会执行包含过程。这也是include指令与include标签的区别。 
    • 注意:<jsp:include page="<%=myfile%>">,这是可以的!因为include指令是在执行时才完成的包含,在执行时已经可以确定myfile这个变量的值。
    • 该标签内部使用的是RequestDispatcher#include()方法完成的包含
  • <jsp:forward> 
    例如:<jsp:forward page="xxx"/>,用来转发到指定页面 
    例如在a.jsp中存在如下内容:<jsp:fowrad page="b.jsp"/> 
    a.jsp中的内容不会显示在浏览器上,而只是显示b.jsp的内容。而且在<jsp:forwad>标签下面的内容不会被执行。
  • <jsp:param> 
    该标签是和的子标签,用来向其他页面传递参数。

六、EL表达式

${pageScope.xxx}、 ${requestScope.xxx}、 ${sessionScope.xxx}、 ${applicationScope.xxx}

七、JSTL标签库

  • JSTL是apache对EL表达式的扩展
  • core:核心标签库,
  • fmt:格式化标签库
  • sql:数据库标签库,过时;
  • xml:xml标签库,过时。

<c:core>

  • <c:out value=”aaa”/> 输出字符串aaa
  • <c:out value="${aaa}”/> 输出域属性aaa,其中与${aaa}相同
  • <c:out value="${aaa}” default=”xxx”/>如果${aaa}不存在,那么输出xxx字符串
  • <c:out value="${aaa}" escapeXml=”true”/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击

<c:set>

  • <c:set var=”a” value=”hello”/> 创建名为a,值为hello的域属性,范围:page
  • <c:set var=”a” value=”hello” scope=”session”/> 范围为session(page、request、session、application)

<C:remove>

  • <c:remove var=”a”/> 删除名为a的域属性
  • <c:remove var=”a” scope=”page”/> 删除page域中名为a的域属性

<C:url>

  • <c:url value=”/AServlet”/> 输出URL:/项目名/AServlet
  • <c:url value=”/AServlet” var=”url” scope=”page”/> 把生成的url保存到page域中,而不会输出
  • 子标签:<c:param>,用来给url后面添加参数,例如:
    <c:url value="/index.jsp">
      <c:param name="username" value="张三"/>  <!--可以对参数进行url编码!!-->
    </c:url>
  • 1
  • 2
  • 3
结果为:/day13_1/index.jsp?username=%ED%2C%3F%ED%2C%3F

* var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成url保存到域中。 
* scope:它与var一起使用,用来保存url。

<C:if>

*<c:if test=”${条件}”> 当条件为true时执行标签体内容 
hello 

<c:choose>

<c:set var="score" value="${param.score }"/>
<c:choose>
    <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>[if]
    <c:when test="${score >= 90 }">A级</c:when>
    <c:when test="${score >= 80 }">B级</c:when>
    <c:when test="${score >= 70 }">C级</c:when>
    <c:when test="${score >= 60 }">D级</c:when>
    <c:otherwise>E级</c:otherwise>[else]
</c:choose>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

<c:forEach>

<c:forEach var="i" begin="1" end="10">
    ${i}
  </c:forEach>
  • 1
  • 2
  • 3

属性: 
* var:循环变量 
* begin:设置循环变量从几开始。 
* end:设置循环变量到几结束。 
* step:设置步长!等同与java中的i++,或i+=2。step默认为1

  • 遍历集合或数组方式:
<%
String[] names = {
    "zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
    <c:out value="name: ${item }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 遍历List
<%
    List<String> names = new ArrayList<String>();
    names.add("zhangSan");
    names.add("liSi");
    pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
    <c:out value="name: ${item }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 遍历Map
<%
    Map<String,String> stu = new LinkedHashMap<String,String>();
    stu.put("number", "N_1001");
    stu.put("name", "zhangSan");
    pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
    <c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 循环状态

循环状态变量有如下属性: 
* count:循环元素的个数 
* index:循环元素的下标 
* first:是否为第一个元素 
* last:是否为最后一个元素 
* current:当前元素

<c:forEach items="${list }" var="ele" varStatus="vs">
    ${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/>
</c:forEach>
  • 1
  • 2
  • 3

fmt库

  • <fmt:formatDate value=”” pattern=”“> 
    value:指定一个Date类型的变量 
    pattern:用来指定输出的模板!例如:yyyy-MM-dd HH:mm:ss 
    <fmt:formatNumber value=”${num1}” pattern=”0.00”> 
    保留小数点后2位,它会四舍五入!如果不足2位,以0补位! 
    <fmt:formatNumber value=”${num1}” pattern=”#.##”> 
    保留小数点后2位,它会四舍五入!如果不足2位,不补位!

八、自定义标签

步骤: 
1. 标签处理类:继承SimpleTagSupport类 
public class HelloTag extends SimpleTagSupport { 
public void doTag() throws JspException, IOException { 
this.getJspContext().getOut().write(“<p>Hello SimpleTag!</p>“) ; 

}

标签描述符文件(tld) 
/WEB-INF/tlds/haha.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xml="http://www.w3.org/XML/1998/namespace" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                        http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">

    <tlib-version>1.0</tlib-version> 
    <short-name>haha</short-name> 
    <uri>http://www.haha.cn/tags</uri> 
    <tag> 
        <name>hello</name> <!--标签名称-->
        <tag-class>cn.haha.tag.HelloTag</tag-class> <!--标签处理类名称-->
        <body-content>empty</body-content> <!--标签体为空,即空标签-->
    </tag>
</taglib>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  1. jsp页面中使用自定义标签
<%@ taglib prefix="it"  uri="/WEB-INF/hello.tld"  %>
......
<it:hello/>
  • 1
  • 2
  • 3

有标签体的标签

  1. 标签处理类 
    public class HelloTag extends SimpleTagSupport { 
    public void doTag() throws JspException, IOException { 
    PageContext pc = (PageContext) this.getJspContext(); 
    HttpServletRequest req = (HttpServletRequest) pc.getRequest(); 
    String s = req.getParameter(“exec”); 
    if(s != null && s.endsWith(“true”)) { 
    // 获取标签体对象 
    JspFragment body = this.getJspBody() ; 
    // 执行标签体 
    body.invoke (null); 
    }


    }

  2. tld

<tag>
        <name>hello</name>
        <tag-class>cn.itcast.tags.HelloTag</tag-class>
        <body-content>scriptless</body-content> <!--标签体内容不可以是java脚本,但可以是el、jstl等-->
    </tag>
  • 1
  • 2
  • 3
  • 4
  • 5

不执行标签下面的页面内容

public void doTag() throws JspException, IOException {
    this.getJspContext().getOut().print("<h1>只能看到我!</h1>");
    throw new SkipPageException();
}

带有属性的标签

public class IfTag extends SimpleTagSupport { 
private boolean test;//设置属性,提供getter/setter方法 
public boolean isTest() { 
return test; 

public void setTest (boolean test) { 
this.test = test; 

@Override 
public void doTag() throws JspException, IOException { 
if(test) {//如果test为true,执行标签体内容 
this.getJspBody().invoke(null); 


}

<tag> 
    <name>if</name> 
    <tag-class>cn.haha.tag.IfTag</tag-class> 
    <body-content>scriptless</body-content>
    <!--部署属性-->
    <attribute> 
        <name>test</name> <!--属性名-->
        <required>true</required> <!--属性是否为必须的-->
        <rtexprvalue>true</rtexprvalue> <!--属性值是否可以为EL或JSTL等-->
    </attribute> 
</tag>

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014231646/article/details/79976715

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签