jsp_day2

1.jsp页面中的注释 comment
第一种:

特点:
1.用户在浏览器中右键查看源代码 [能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [能] 看到这个注释.

注意: jsp动作元素 放在这种注释里面是不起作用(注释不起作用,jsp动作元素正常执行)
例如:下面的注释不起作用
<!-- 
	<jsp:forward page="hello.jsp"></jsp:forward>
-->
但是使用隐藏注释,可以是把这个动作元素注释掉的。


第二种:
<%-- 
jsp中的注释方式(隐藏注释)
--%>
特点:
1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [不能] 看到这个注释.



第三种:
java中的注释方式,但是这种注释方式只能在jsp的脚本或者声明中使用。
//String name = "tom";

/* 
	int b = 40;
*/
	 	
/**
	int a = 20;
*/
特点:
1.用户在浏览器中右键查看源代码 [不能] 看到这个注释。
2.在服务器端,这个jsp页面被翻译成的java文件中 [能] 看到这个注释.

2.在jsp页面代码中可以直接使用的对象(jsp内置对象)
其实是只有在这个_jspService()方法中才能使用
jsp脚本和jsp表达式
<% 脚本 %>
<%= 表达式 %>

一共有9个内置对象可以直接使用.
      类型           名字
PageContext         pageContext
HttpServletRequest  request
HttpSession			session
ServletContext	    application
Object				page
HttpServletResponse response
JspWriter			out
ServletConfig	    config
Throwable			exception

注意:为什么这个写对象可以直接使用,因为他们都是在_jspService这个方法中默认声明了出来.而我们在表达式和脚本中所写的java代码将来是要翻译到_jspService方法中的,所以我们在表达式和脚本中写java代码的时候可以直接使用这些对象.

四个范围对象,在一定范围内可以存取数据:
//页面范围(只能在同一个页面中起作用)
pageContext    
request
session
application

//虽然名字叫page,但是这个并不是页面范围对象,它是Object类型的对象,表示当前这个页面本身(jsp页面就是一个servlet).

其实page指的是jsp页面翻译成的java类对象,服务器使用这个java类所创建的对象(把page对象输出即可看到),所以说page对象代表jsp页面本身
page
	<%=(page==this)%><br> 输出结果为true

response

//用于向浏览器输出内容的输出流.
out

config

//这个对象其实我们并不能直接使用,需要相关设置后才能使用,这个可以算是一个隐藏对象.这个对象表示将来这个jsp页面运行出错的时候所抛出的异常对象.
exception

3.jsp页面中的路径
一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一样的,但是在jsp中可以动态获得该项目的url。

如果在jsp页面的上面写了这样一个脚本:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
并且再<head>标签中加入了一个子标签:
<base href="<%=basePath%>" />

那么在这个jsp页面中,我们再去写上一个相对路径(最左边没有加/的那种路径),它就不是相对于地址栏中的当前路径了,而是要相对于这个basePath变量所代表的这个路径.

4.EL表达式
形式:${ }
作用:从一个范围里面取值或者从一个对象中取值或是向页面输出值.
(取值并显示)
1.接收客户端参数.
${param.name1 }

2.指定范围并取值
   ${pageScope.name2 }
   ${requestScope.name3 }
   ${sessionScope.name4 }
   ${applicationScope.name5 }

3.可以不指定范围再去取值
   ${name}
   这时候会按照pageContext request session application这样一个顺序依次的去找有没有一个叫name的值存在,一旦找到了就输出出来,最终没有找到那么就什么都不输出。

4.取出一个对象中的属性值.
   ${requestScope.student.id}
   ${requestScope.student.name}
   ${requestScope.student.age}
   或者
   ${student.id}
   ${student.name}
   ${student.age}
   或者
   ${student["id"]}
   ${student["name"]}
   ${student["age"]}

   注意:${student.id}表示是要调用student对象中的getId方法,至于对象中有没有id属性对这个操作没有任何影响.所以这和id指的是对象中的property而不是attribute

   如果Student类中一个方法是getAddress,返回一个Address类的对象,Address类中有一个方法getCity,这个时候我们就可以这样写去拿到city属性的值.
   ${student.address.city}


5.输出字符串
    ${"hello"}

6.输出运算结果或者boolean表达式
    ${1+1 }
    ${(1+2)*3-4+5*3 }
	${u.age * 10 }
    ${1<3 }
    //为空的话返回true
    ${empty "" }
    ${empty "hello" }
    //取否 不为空的话返回true
    ${not empty "hello" }
    ${! empty "hello" }
    ${param.score >50 }
    ${param.score >60?"good":"bad" }

7.输出数组、集合中的元素
	<%
	String[] str = {"hello","world"};

	List<String> list = new ArrayList<String>();
	list.add("zhangsan");
	list.add("lisi");
	
	Map<String,Integer> map = new HashMap<String,Integer>();
	map.put("a",100);
	map.put("b",200);
	map.put("c",300);
	
	request.setAttribute("str",str);
	request.setAttribute("list",list);
	request.setAttribute("map",map);
	
	%>

	${str[0] }<br>
	${list[1] }<br>
	${map["c"] }<br>

8.key的值中含有特殊符号点.
	例如 request对象中有一个key值为:javax.servlet.forward.request_uri
	
	要取值这个值必须用这种形式:
	${requestScope['javax.servlet.forward.request_uri'] }

5.JSTL标签库
JSP Standard Tag Library(JSTL)
1.让web项目支持JSTL标签库
在eclipse中,建一个文本项目,默认都是不支持JSTL,所以需要我们自己把JSTL的jar包导入到项目中(复制粘贴到项目中的lib目录):jstl-1.2.jar

2.把JSTL标签库导入到某一个jsp页面中
 使用jsp中的taglib指令:
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 prefix="c"相当于给这个标签库起一个别名,将来在页面中就是用以c开头的标签来使用标签库中的标签。这个别名也可以叫其他的名字。

<c:forEach>标签:
  <%
	List<Student> list = new ArrayList<Student>();
	list.add(new Student(1,"tom1",21));
	list.add(new Student(2,"tom2",22));
	list.add(new Student(3,"tom3",23));
	list.add(new Student(4,"tom4",24));
	session.setAttribute("list", list);
  %>
  
  <c:forEach items="${list }" var ="stu" begin="0" end ="3" varStatus="status" step="1">  
	${status.index } : ${stu.id } - ${stu.name } - ${stu.age } <br>  
  </c:forEach>  
  begin=""默认值是0  end =""默认值是最后一个元素,一般的遍历只要写var和items来个属性即可


  遍历List集合:
  students是放进request对象中的一个List集合,集合中存放的是Student类型的对象.
  items=""属性值是要遍历的集合
  var=""  属性值是每次遍历到的对象用什么名字的变量去接收。
  <c:forEach items="${students}" var="stu">
	<tr>
		<td>${stu.id }</td>
		<td>${stu.name }</td>
		<td>${stu.age }</td>
	</tr>
 </c:forEach>

遍历Map集合:
map是一个Map类型的集合,放到了request对象中,entry是我们顶一个的一个变量,用做接收每次遍历到的集合中的一组键值对,我们可以通过entry.key entry.value分别拿到这次遍历到的key值和value值
<c:forEach items="${map}" var="entry">
	${entry.key }-->${entry.value.id } &nbsp; ${entry.value.name } &nbsp; ${entry.value.age }<br>
</c:forEach>


<c:out>标签:
向页面输出内容,就像<%= ... >
<c:out value="hello"></c:out>
<c:out value="${5+5}"></c:out>
//students是放在request中的List集合,集合里面是Student对象
<c:out value="${students[2].id}"></c:out>

<c:set>标签:
向某一个范围对象中存放一个值。
<c:set var="name" value="zhangsan" scope="request"></c:set>

<c:remove>标签:
从某个范围对象中把某个值给移除掉.
<c:remove var="name" scope="request"/>

<c:if>标签:
条件判断
<%
request.setAttribute("score",40);
%>
	
<c:if test="${score>85 }">
	<font color="red">你的分数超过了85分</font>
</c:if>
<c:if test="${score>95 }">
	<font color="red">你的分数超过了95分</font>
</c:if>

这样写相当于:
if(score>85){
	...
}
if(score>95){
	...
}



<c:catch>标签:处理产生错误的异常状况,并且将错误信息储存起来。
<c:catch var ="catchException">
   <% int x = 1/0;%>
</c:catch>

<c:if test = "${catchException != null}">
   <p>异常为 : ${catchException} <br />
   发生了异常: ${catchException.message}</p>
</c:if>

<c:import>标签:和<jsp:include>的作用基本相同,<c:import>还可以选择把引入的内容先保存在一个变量中,之后通过EL表达式再拿出来显示

<c:import url="a.jsp" />
或者
<c:import var="data" url="a.jsp" />
${data}



<c:choose>标签
<c:when>标签
<c:otherwise>标签
例如:
<c:choose>
	<c:when test="${score>=90 }">优</c:when>
	<c:when test="${score>=80 }">良</c:when>
	<c:when test="${score>=70 }">中</c:when>
	<c:when test="${score>=60 }">及格</c:when>
	<c:otherwise>差</c:otherwise>
</c:choose>
相当于:
if(score>=90){

}else if(score>=80){

}else if(score>=70){

}eles if(score>=60){

}else{

}

<c:redirect>标签重定向
<c:redirect url="a.jsp"/>

6.自定义标签
JSP1.1版本中增加了自定义标签库规范,但是在 JSP1.1规范中开发自定义标签库比较复杂,JSP2.0 规范简化了标签库的开发,只需如下几个步骤
1.编写自定义标签处理类
2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可以对应多个标签,该文件放在WEB-INF下即可
3.在jsp文件中使用tablib指令引入并使用自定义标签

注意:我们使用的tomcat8.5.38中实现的是JSP2.3的规范。

javax.servlet.jsp.tagext.JspTag接口
所有的标签,都需要实现这个接口

默认情况下,jsp中已经提了该接口的一些实现,其实名为XxxxSupport的类,是我们在自定义标签的时候,可以继承的父类型。

JSP2.0版本中,提供了javax.servlet.jsp.tagext.SimpleTagSupport类,我们编写的自定义标签处理类继承该类即可。


例如1:编写一个标签,可以自动输出hello
第一步:
继承SimpleTagSupport,重写doTag即可
public class HelloTag extends SimpleTagSupport {
	@Override
	public void doTag() throws JspException, IOException {
		super.getJspContext().getOut().println("hello");
	}
}

第二步:
编写my-tag.tld文件(名字随意),存放在WEB-INF下:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
		PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
		"http://www.JAVA.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>my-taglib</short-name>
  <uri>briup-taglib</uri>

  <tag>
	<name>hello</name>
	<tag-class>com.briup.test.HelloTag</tag-class>
	<body-content>empty</body-content>
  </tag>
  
</taglib>

注意1:该文件的样例可以在tomcat中的实例项目中复制出来修改。例如:
D:\jd2019\apache-tomcat-8.5.38\webapps\examples\WEB-INF\jsp\example-taglib.tld文件

注意2:<body-content>标签中的值,表示自定义标签中body部分可以填写的内容类型,有四种:
empty 
	空标记,即起始标记和结束标记之间没有内容

scriptless
	接受文本、EL和JSP动作

JSP (SimpleTagSupport类型不支持)
	接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作

tagdependent
	标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释





第三步:jsp页面中引入并使用标签库
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="briup-taglib" prefix="briup" %>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>hello.jsp</title>
	</head>
	<body>
		<briup:hello></briup:hello>
	</body>
</html>


=========================



例如2:编写一个标签,可以自动输出hello,并附带上标签体中的内容

第一步:修改HelloTag类
public class HelloTag extends SimpleTagSupport {
	@Override
	public void doTag() throws JspException, IOException {
		//准备好一个StringWriter,接收标签体内容
		StringWriter sw = new StringWriter();

		//把标签体内容写到StringWriter中
		super.getJspBody().invoke(sw);

		//从StringWriter中获取标签体的内容
		String tagBody = sw.toString();
	
		super.getJspContext().getOut().println("hello! "+tagBody);
	
	}
}

第二步:修改my-tag.tld文件
<tag>
	<name>hello</name>
	<tag-class>com.briup.test.HelloTag</tag-class>
	<body-content>scriptless</body-content>
</tag>

注意:只是修改了<body-content>标签中的值,这里改为scriptless或者tagdependent都是可以的.其他地方不用修改


第三步:修改jsp文件,添加标签body内容即可

<briup:hello>tom</briup:hello>



=========================


例如3:编写一个标签,可以自动输出hello,并附带上标签体中的内容,并且根据标签中属性的值,来确定内容将会输出多少次


第一步:修改HelloTag类
修改地方1,添加属性count,提供get/set方法,用来接收标签中属性的count属性的值
修改地方2,输出内容语句外面嵌套循环,循环次数由count的值来控制
public class HelloTag extends SimpleTagSupport {
	private int count;

	@Override
	public void doTag() throws JspException, IOException {
		//准备好一个StringWriter,接收标签体内容
		StringWriter sw = new StringWriter();
		
		//把标签体内容写到StringWriter中
		super.getJspBody().invoke(sw);
		
		//从StringWriter中获取标签体的内容
		String tagBody = sw.toString();
		
		for(int i=0;i<count;i++) {
			super.getJspContext().getOut().println("hello! "+tagBody+"<br>");
		}
		
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
}


第二步:修改my-tag.tld文件
修改地方,添加attribute标签来指定属性的相关信息
<tag>
	<name>hello</name>
	<tag-class>com.briup.test.HelloTag</tag-class>
	<body-content>scriptless</body-content>
	<attribute>
		<name>count</name>
		<required>true</required>
	</attribute>
</tag>


第三步:修改jsp文件,添加标签的属性
<briup:hello count="5">tom</briup:hello>


=========================

例如4:编写一个标签,可以自动输出hello,并附带上标签体中的内容,并且根据标签中属性的值,来确定内容将会输出多少次,同时标签体值和属性的值都是要EL表达式来表示

第一步:HelloTag类,和例3保持一致,不需要改动

第二步:修改my-tag.tld文件
修改地方,添加标签<rtexprvalue>,表示支持EL
rtexprvalue的意思是:Runtime Expression Value
<tag>
	<name>hello</name>
	<tag-class>com.briup.test.HelloTag</tag-class>
	<body-content>scriptless</body-content>
	<attribute>
		<name>count</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

第三步:修改jsp文件,添加标签的属性
修改地方,添加了jsp脚本,配合测试
<%
	request.setAttribute("name", "zs");
	request.setAttribute("count", "10");
%>
<briup:hello count="${count }">${name }</briup:hello>
内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值