一、JSP标签
1、JSP标签的简单介绍
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
2、常用的JSP标签
<jsp:include> 动态的包含页面
<jsp:forword> 进行资源的转换
<jsp:param> 参数的赋值
3、 <jsp:include>标签
<jsp:include>用于在JSP页面把另一个资源的输出内容,插入到该jsp的输出内容中,这种插入方式叫做动态引入。
语法:
<jsp:include page="relativeURL|<%= expression %>" flush="true|false"/>
page属性的值,可以自己指定一个值,也可以根据一个表达式来获得。
flush属性指定在插入其它资源前,是否将当前jsp的内容刷新到客户端。
默认为false,在include另一个jsp文件时,默认情况下,服务器会等待该文件被读到底端,然后才输出到客户端,并且销毁该次访问的request和response。而当把flush属性赋为真值 时,在缓存累积了一定数据时,服务器会先提供一部分数据给浏览器,并等待后续内容 。
代码实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("end","End.jsp");
%>
<jsp:include page="/jsp/import/Head.jsp" flush="false"></jsp:include>
//记得转型
<jsp:include page='<%= (String) request.getAttribute("end") %>' flush="true"></jsp:include>
</body>
</html>
3.1<jsp:include>与include指令的区别
<jsp:include>是动态引入,假设涉及到两个jsp页面会把两个jsp页面翻译为两个servlet页面。这两个servlet在执行的时候,会进行合并。
include指令为静态引入,就是把两个jsp页面合并到一起,然后翻译成一个servlet的页面。
使用incude指令合并:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name="demo2";
%>
<p>demo2中的name值为<%= name%></p>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name="demo1";
%>
<p>demo1中的name值为:<%= name%></p>
<%@include file="demo2.jsp"%>
</body>
</html>
这里发生的错误,可以看出include的标签,实在源文件的基础上进行了,何不,所以出现了重复定义局部变量的错误。
修改为<jsp:include>引入
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name="demo1";
%>
<p>demo1中的name值为:<%= name%></p>
<%--<%@include file="demo2.jsp"%>--%>
<jsp:include page="demo2.jsp"></jsp:include>
</body>
</html>
这样就没有问题了。
3.2解决<jsp:include>引入.jspf文件出现异常的问题
一般按照标准,我们需要引入的jsp资源文件的后缀面应该是.jspf,在总结的时候,发现当使用include标签合并两个.jspf文件时,没有出现问题,但是使用<jsp:include>标签引入的时候,出现了异常.
我们发现浏览器把.jspf文件当作纯文本来解决了,解决方法是在Tomcat服务器下web.xml文件下添加,如下的配置
4、<jsp:forword>标签
<jsp:forward>标签用于把请求转发给另外一个资源。
语法:
<jsp:forward page="relativeURL | <%=expression%>" />
page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是我们的网页开头哦</h1>
//也可以用表达式来获取
<jsp:forward page="End.jsp"></jsp:forward>
</body>
</html>
5、<jsp:param>标签
当使用<jsp:include>与<jsp:forword>标签时,可以使用<jsp:param>标签来进行一些数值的传递.
代码实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是我们的网页开头哦</h1>
<jsp:forward page="End.jsp">
<jsp:param name="name" value="luther"></jsp:param>
<jsp:param name="age" value="99"></jsp:param>
</jsp:forward>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>这是我们的网页结尾哦</h1>
name:<span><%=request.getParameter("name")%></span><br>
age:<span><%=request.getParameter("age")%></span>
</body>
</html>
二、JavaBean总结
1、什么是JavaBean。
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性(成员属性要是私有的),set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
2、JavaBean的属性的要求
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
3、jsp中访问JavaBean的jsp标签。
<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
<jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
<jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。
3.1<jsp:useBean>
<jsp:useBean>标签用来在指定的域范围内来寻找JavaBean对象,如果存在则直接返回一个指向JavaBean对象的引用,如果不存在则实例化一个新的JavaBean对象,以指定的名称存放到指定的域中。
语法:
<jsp:useBean id="beanName" class="com.luther.JavaBean.Test" scope="session|request|page|application"/>
id:指定指向JavaBean对象实例和存放在域中的名称
class:指定JavaBean完整的类名(包名+类名)
scope:指定JavaBean实例对象存储的域,默认为page
使用实例:
JavaBean:
package com.luther.TestWeb;
public class PersonBean {
private String name;
private String sex;
private int age;
public PersonBean(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="person" class="com.luther.TestWeb.PersonBean" scope="session"/>
<html>
<head>
<title>如何使用JavaBean</title>
</head>
<body>
<%
String sex="male";
person.setName("哈哈哈");
person.setAge(18);
person.setSex("male");
%>
<p><%=person.getName()%></p>
<p><%=person.getAge()%></p>
<p><%=person.getSex()%></p>
</body>
</html>
3.1.1 <jsp:useBean>的实现原理
<jsp:useBean>如何实例话一个对象呢。由于jsp会被jsp引擎翻译成一个servlet文件,所以我们可以找到生成的.java文件来查看。
查找的位置(IDEA例):
C:\Users\bang\.IntelliJIdea2018.2\system\tomcat\Tomcat_9_0_12_项目名\work\Catalina\localhost\ROOT\org\apache\jsp下寻找.
//初始化对象为null
com.luther.TestWeb.PersonBean person = null;
//加同步,防止线程问题
synchronized (session) {
//获取存储在session作用域中的对象
person = (com.luther.TestWeb.PersonBean) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.SESSION_SCOPE);
//如果没有就重新new一个对象
if (person == null){
person = new com.luther.TestWeb.PersonBean();
//存储到session对象中
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}
3.1.2、带标签体的<jsp:useBean>标签
语法:
<jsp:useBean ...>
Body
</jsp:useBean>
功能:
Body部分的内容只在<jsp:useBean>标签创建JavaBean的实例对象时才执行。
3.2<jsp:setProperty>与<jsp:getProperty>
我们在jsp文件如果使用像上面代码那样的赋值与取值方法,这样不利于我们的维护,可以阅读性也较差,所以这里提供了两个标签里供我们使用。
<jsp:setProperty>
语法一:
<jsp:setProperty name=" " property=" " value="字符串|<%= 表达式%> "/>
name:用于指定实例对象的名称,<jsp:useBean>中的id属性值
property:要赋值的参数名,一定要和JavaBean中的属性名一致
value:赋值的值
语法二:
<jsp:setProperty name=" " property=" " param=" "/>
param:用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。
语法三:
<jsp:setProperty name=" " property="* " />
用所有请求参数来赋值。
语法三代码实例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="person" class="com.luther.TestWeb.PersonBean" scope="session"/>
<html>
<head>
<title>如何使用JavaBean</title>
</head>
<body>
<jsp:setProperty name="person" property="*"/>
<%
String sex="male";
%>
<p><%=person.getName()%></p>
<p><%=person.getAge()%></p>
<p><%=person.getSex()%></p>
</body>
</html>
<jsp:getProperty>
语法:
<jsp:getProperty name="person" property="name"/>
name:实例化对象引用的名称
property:JavaBean的属性名
总结实例代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="person" class="com.luther.TestWeb.PersonBean" scope="session"/>
<html>
<head>
<title>如何使用JavaBean</title>
</head>
<body>
<%
String sex="male";
%>
<jsp:setProperty name="person" property="name" value="Luther"/>
<jsp:setProperty name="person" property="sex" value="<%=sex%>"/>
<jsp:setProperty name="person" property="age" param="age1"/>
<h1>姓名:<jsp:getProperty name="person" property="name"/></h1>
<h2>年龄:<jsp:getProperty name="person" property="age"/></h2>
<h3>性别:<jsp:getProperty name="person" property="sex"/></h3>
</body>
</html>