jsp:一个可以存放java与html混写的文件
从某种层面来说,它实际就是一个servlet
因此servlet里面能定义获取的,他也可以用,只不过方式不一样。
java在我们访问一个jsp的时候,会自动把jsp文件编译一个带有service方法的java文件。这个文件存放在IDE给我们配置项目的缓存目录里面,在work目录下面。work就是在我们的工作的过程中产生的文件
顺便看一个文件看看
很明显可以看到,内部也是给我们转化了servelt文件,然后给我们编译了一个service方法,然后把我们需要的东西放进去了。·
下面说一下JSP定义代码的方式:
话不多说,直接上代码:
demo1.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/3/18
Time: 12:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
int i = 3;//这里就是定义到service里面的变量
%>
<%!
int i =10;//这个就是转换后java文件的成员位置上面
%>
<%=
i//这里就会把上面定义的i变量直接输出到浏览器,这里会打印3,就近原则,其实这里
//这是在service方法里面执行
%>
上面运行一下
这里会打印3,直接看一下转换后的源文件
上面可以看到i=10这个变量,被定义成了一个类的成员属性
上面i=3就把它定义到service方法里面,并且在service方法里面打印了数据。
我们还可以调用内部的内置对象
下面来说九个jsp内置对象
下面简单来说一下mvc开发模式:一种开发软件的方法
下面来说一下EL表达式,这玩意就是用在jsp页面,用来简化java代码页面编写 ,他不用放到<% %>这个里面
下面简单说一下EL表达式中的隐式对象:
EL有十几个隐式对象,就像上面四种,我们这里重点说一下pageContext隐式域,他可以获取JSP其他八个内置对象
${pageContext.request.contextPath}:动态获取虚拟目录
这里面request对象,里面有一个getContextPath()方法,所以可以通过.contextPath来获取虚拟目录
那么我们换句话说,我们获取虚拟目录可以这样${requestScope.contextPath},这样是不可以的啊
说一下这两者的区别,先看一下打印信息
一个打印的是这个域对象的地址,一个只是获取到这个域设置的值 ,这个只是给我们返回一个相应对象数据的map集合,里面存放了我们的数据而已。
说说EL表达式的具体用法
先来说一下利用对象的get方法获取值得问题
再来说一下,从服务器端获取值的问题
先来看服务器端代码
@WebServlet("/servletDemo2")
public class ServletDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
//带一个对象过去
User user = new User();
user.setAge(23);
user.setHeight(178);
user.setName("张三");
//创建一list集合数据
List list1 = new ArrayList();
list1.add("周杰伦");
list1.add("林俊杰");
//创建一个Map集合数据
Map map1 = new HashMap();
map1.put("01","haha");
map1.put("02","hehe");
//添加两个集合进去
request.setAttribute("list1",list1);
request.setAttribute("map1",map1);
request.setAttribute("user",user);
request.setAttribute("color","red");
request.setAttribute("waist",89.78);
//利用servletContext对象来设置属性
ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("color","blue");
//这里我们在来弄个域,这个是全局域
//页面内转发,地址栏不变
request.getRequestDispatcher( "/test1.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
this.doPost(request, response);
}
}
一般取值就是直接如下
当然了,我们还可以按照如下方式取值
另外还可以采用jsp<%%>的方式来获取
但是一般获取某个数据还是采用EL表达式的写法来做。但是如果在一个服务器页面中,同时存在两个相同的属性,比如下面
那如果你是采用如下方式获取color
他就从pageContext->request->session->servletContext->response从小到大的域开始寻找,很明显就是先获取的request域的color,如果想要获取servletContext中的color,就按照如下方式
指定某个域的某个具体的属性值
主要是获取服务器端传过来的数据。上面说了比如获取某个之前已经设定好的方法
下面来说一下JSTL标签
再来具体说一下foreach标签:
话不多说,上个代码
<%@ page import="domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Title
<%
List list = new ArrayList();
list.add(new User("tom",25,new Date()));
list.add(new User("tonny",28,new Date()));
list.add(new User("jack",35,new Date()));
//在request域中
request.setAttribute("list",list);
%>
编号
姓名
性别
生日
${s.count}
${user.age}
${user.name}
${user.birday}
${s.count}
${user.age}
${user.name}
${user.birday}