20210712_jsp01


jsp
今天的任务
1.响应
2.jsp
3.EL标签是
4.jstl标签

一、servlet响应数据给浏览器

1.普通字符串

public void response1(HttpServletResponse resp) throws IOException{
//设置了响应的编码格式,转为字节流式,字符占的字节个数
resp.setCharacterEncoding("utf-8");
//告诉了浏览器,解析服务响应的信息时按照哪种个数解析
resp.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
String str="hello";
out.write(str);
out.close();
}

2.html标签的字符串

public void response1(HttpServletResponse resp) throws IOException{
//响应信息给浏览器
PrintWriter out=resp.getWriter();
String str="<html><head></head>"
+ "<body><hr/></body>"
+ "</html>";
out.write(str);
out.close();
}

3.响应一个文件(.html)给浏览器

public void response2(HttpServletResponse resp) throws IOException{
PrintWriter out=resp.getWriter();
File f=new File("D:/Program Files/tomcat/apache-tomcat-7.0.105/webapps/web02/01.html");
BufferedReader br=new BufferedReader(new FileReader(f));
String str=null;
while( (str=br.readLine())!=null ){
out.write(str);
}
out.flush();
out.close();
System.out.println(f.getAbsolutePath());
}

4.通过调用request对象的方法响应指定html文件

public void response3(HttpServletRequest req,HttpServletResponse resp) throws IOException{
//
try {
req.getRequestDispatcher("01.html").forward(req, resp);
//提交响应后无法转发,只能响应一次,已经响应了,找不到当前的客户端了
//req.getRequestDispatcher("02.html").forward(req, resp);
} catch (ServletException e) {
e.printStackTrace();
}
}
如果不同登录的人,在主页面上显示的登录账号是不同的
1.AJAX(前端技术),单独把数据传输给前端
2.jsp页面的方式的进行完成:可以html标签+java代码的

二、jsp

1.简介

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTMLXML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

2.jsp执行的过程

1.jsp,通过tomcat翻译.java,java文件中会向浏览器写一些信息出去,代码, 将该文件编译器为.class的文件,jvm运行这个字节码文件,将信息输出给了浏览器;
2.jsp页面最终tomcat生成一个是servlet,这个Servlet只是一个Html的模板;
3.当调用时才进行1的操作
Day21jsp - 图1
Day21jsp - 图2
1.tomcat将.jsp的文件翻译为.java的文件,而发生翻译的这个文件类似我们自己编写Servlet
2.开发环境中中编译器,编译为字节码文件,.class

  1. 运行环境中jvm,将字节文件运行起来,生成静态资源,响应给了客户端浏览器
    Day21jsp - 图3

Day21jsp - 图4
Day21jsp - 图5

3.面试题

1).jsp和Servlet的区别

1.都属于javaWeb动态资源
2.本质jsp还是一个Servlet,编写时是jsp文件罢了,但用jsp时,tomcat对jsp翻译为.java文件,jdk编译为.class,jvm运行的class文件
3.jsp页面比较擅长操作标签的操作,而servlet擅长是业务逻辑的处理;

2).jsp的执行过程

三、EL表达式

注解是简化取值 例如:request.getAttribute(“users”); 使用EL ${users}
语法:
${key.xxx }
xxx:可以是属性,也可以是方法
在jsp中嵌入java代码
<%! String str="你好"; %>
<!-- 输出一个变量 -->
<h2>
<%List<User> list=(List<User>)request.getAttribute("users"); %>
</h2>
<hr/>
`<br /> ${users.length}<br />在jsp页面中嵌入java代码的缺陷:<br />JavaBean在JSP中的局限<br />在JSP页面中嵌入大量的JAVA代码<br />获取JavaBean属性必须实例化<br />强制类型转化<br />而El表达式可以解决以上问题<br />el:Expression Language(表达式语言)<br />使用的语法结构是: ${作用域.属性名}<br />![](https://cdn.nlark.com/yuque/0/2021/png/21478822/1626090460377-12379f29-e272-4f46-9b0f-c7c92d7b0f25.png#align=left&display=inline&height=224&margin=%5Bobject%20Object%5D&originHeight=224&originWidth=432&size=0&status=done&style=none&width=432)<br />EL表达式可以是算术运算符,比较运算符和逻辑运算符<br />//servlet类中的代码<br />req.setAttribute(“num”, 10);<br />//jsp中的代码<br />

算术运行:${num+10}

<br />

比较运算:${num>=10}

<br />

逻辑运行:${num>=10 && num<=10 }

`

四、jstl

通俗:就是在jsp页面中使用的特殊标签而已
Day21jsp - 图6

1.使用步骤

1)在工程中引用JSTL的jar包

2)在JSP页面中添加taglib指令

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

3)使用JSTL标签

Day21jsp - 图7

2.分支结构标签的使用

if标签

//servlet中的代码
User u=new User();
u.setLname("trump");
u.setName("川建国");
u.setUid(2);
req.setAttribute("map1", u);
//req.getRequestDispatcher("SecondJsp.jsp").forward(req, resp);
req.getRequestDispatcher("ThirdJsp.jsp").forward(req, resp);
//jsp中代码
<!-- 单分支 -->
<ly:if test="${!empty map1 }">
<form action="">
<input type="hidden" value="${map1.uid}"/>
账号:<input value="${map1.lname}"/><br/>
姓名:<input value="${map1.name}"/>
<input type="submit">
</form>
</ly:if>

choose标签,多分支

//servlet代码
List<String> list=new ArrayList<>();
list.add("lucy");
// list.add("川建国");
// list.add("拜登");
// list.add("奥巴马");
// list.add("不舍");
req.setAttribute("list", list);
req.getRequestDispatcher("FourJsp.jsp").forward(req, resp);
//jsp代码
<!-- 可以分多种情况 -->
<c:choose>
<c:when test="${!empty map1 }">
<form action="">
<input type="hidden" value="${map1.uid}"/>
账号:<input value="${map1.lname}"/><br/>
姓名:<input value="${map1.name}"/>
<input type="submit">
</form>
</c:when>
<c:otherwise >
<h1>没有数据</h1>
</c:otherwise>
</c:choose>
<hr/>
<!-- 多分支 -->
<c:choose>
<c:when test="${list.size()>=4}">至少有4个数据</c:when>
<c:when test="${list.size()>=2}">至少有两个数据</c:when>
<c:otherwise>
数据比较少
</c:otherwise>
</c:choose>

foreach标签

items是要遍历的对象,var是其中一个元素
//servlet代码
List<User> list=new ArrayList<>();
list.add(new User(1, "lucy1", "露西1", "123"));
list.add(new User(2, "lucy2", "露西2", "123"));
list.add(new User(3, "lucy3", "露西3", "123"));
list.add(new User(4, "lucy4", "露西4", "123"));
req.setAttribute("list", list);
req.getRequestDispatcher("FiveJsp.jsp").forward(req, resp);
//jsp页面代码
<c:forEach items="${list}" var="u">
<h1>${u.uid },${u.lname },${u.name },${u.psw }</h1>
</c:forEach>
<hr/>
<table class="table table-striped table-hover">
<tr>
<th>编号</th>
<th>账号</th>
<th>姓名</th>
<th>密码</th>
</tr>
<c:forEach items="${list }" var="u">
<tr>
<td>${u.uid }</td>
<td>${u.lname }</td>
<td>${u.name }</td>
<td>${u.psw }</td>
</tr>
</c:forEach>
</table>