我是靠谱客的博主 威武自行车,最近开发中收集的这篇文章主要介绍尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)书城项目JSP,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
书城项目
JavaEE三层架构介绍
搭建书城项目环境
IDEA工具Debug的使用
JSP
什么是jsp
jsp页面的本质
jsp的page指令
- 虽然 / 在浏览器解析的时候是端口号,但是jsp本质最终还是被翻译成servlet程序,所以还是被 服务器 解析,那么 / 被服务器解析得到的还是工程路径
声明脚本
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--1. 声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String, Object> map;
%>
<%--2.声明static静态代码块--%>
<%!
static {
map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
}
%>
<%--3.声明类方法--%>
<%!
public int abc() {
return 12;
}
%>
<%--4.生成内部类--%>
<%!
public static class A {
private Integer id = 12;
private String abc = "abc";
}
%>
</body>
</html>
- jsp也会自动导包
- 在声明了类的属性后,进入
a.java
即翻译后的程序后,发现我们定义的属性已经在源码中啦
表达式脚本
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--1. 声明类属性--%>
<%!
private Integer id;
private String name;
private static Map<String, Object> map;
%>
<%--2.声明static静态代码块--%>
<%!
static {
map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
}
%>
<%--3.声明类方法--%>
<%!
public int abc() {
return 12;
}
%>
<%--4.生成内部类--%>
<%!
public static class A {
private Integer id = 12;
private String abc = "abc";
}
%>
<%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%>
<%=12 %> <br>
<%=12.12 %> <br>
<%="这是一个字符串" %> <br>
<%=map %> <br>
</body>
</html>
- 翻译后的程序中,在 _jspService 这个方法中 :
<%--表达式脚本可以在页面输出 整型、浮点型、字符串、对象--%>
<%=12 %> <br>
<%=12.12 %> <br>
<%="这是一个字符串" %> <br>
<%=map %> <br>
<%=request.getParameter("username")%>
</body>
</html>
代码脚本
- _jspService方法中的现有对象都可以直接使用 :
- 由多个代码脚本块组合完成一个完整的java语句 :
- 代码脚本可以和表达式脚本一起使用,在jsp页面输出数据 :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0">
<%
for (int j = 0; j < 10; j ++ ) {
%>
<tr>
<td>第 <%=j + 1%>行</td>
</tr>
<%
}
%>
</table>
</body>
</html>
jsp中的三种注释
1.html注释
<!-- 这是html注释 -->
html注释会被翻译到java源代码中。在_jspService方法里,以out.write输出到客户端
- jsp注释是jsp中真正的注释
jsp中的九大内置对象
jsp中的内置对象,是指tomcat在翻译jsp页面成为servlet源代码后,内部提供的九大对象,叫内置对象
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
request : 请求对象
response :响应对象
pageContext :jsp的上下文对象
session :会话对象
application :ServletContext对象(Servlet上下文对象)
config :ServletConfig对象
out :jsp输出流对象
page :指向当前jsp的对象
第九个对象需要isErrorPage为true才会出现,也就是 exception :异常对象
jsp四大域对象的演示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope.jsp页面</h1>
<%
// 往四个域中都分别存了数据
pageContext.setAttribute("key", "pageContext");
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
%>
pageContext域是否有值 :<%=pageContext.getAttribute("key")%> <br>
request域是否有值 :<%=request.getAttribute("key")%> <br>
session域是否有值 :<%=session.getAttribute("key")%> <br>
application域是否有值 :<%=application.getAttribute("key")%> <br>
<%
request.getRequestDispatcher("/scope2.jsp").forward(request, response);
%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>scope2.jsp页面</h1>
pageContext域是否有值 :<%=pageContext.getAttribute("key")%> <br>
request域是否有值 :<%=request.getAttribute("key")%> <br>
session域是否有值 :<%=session.getAttribute("key")%> <br>
application域是否有值 :<%=application.getAttribute("key")%> <br>
</body>
</html>
- 整个请求转发还是 一次请求
- 关闭浏览器以后再打开scope2.jsp页面(没有关闭服务器) :
- 重新部署tomcat,再访问scope2 :
- 数据存储在域对象中需要占据空间,如果使用范围大的,可能已经被用过了,但是并没有释放空间,所以优先使用范围小的,使用完自动销毁
out和response.getWriter输出的区别
<%
out.write("out 1");
out.flush();
out.write("out 2");
response.getWriter().write("res 1");
response.getWriter().write("res 2");
%>
常用标签之 静态包含
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>main.jsp</title>
</head>
<body>
头部信息 <br>
主题内容 <br>
<%--
<%@include file=""%> 就是静态包含
file属性制定你要包含的jsp页面的路径
地址中第一个斜杠 / 表示 http://ip:port/工程路径/ 映射到代码的web目录
静态包含的特点 :
1、静态包含不会翻译被包含的jsp页面
2、静态包含其实是被被包含的jsp页面的代码拷贝到包含的位置执行输出
--%>
<%@include file="/include/footer.jsp"%>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>footer.jsp</title>
</head>
<body>
页脚信息 <br>
</body>
</html>
常用标签之 动态包含
动态包含的底层原理 :
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>main.jsp</title>
</head>
<body>
头部信息 <br>
主题内容 <br>
<%--
<jsp:include page=""></jsp:include> 这是动态包含
动态包含也可以像静态包含一样把被包含的内容输出到包含位置
动态包含的特点 :
1、动态包含会把包含的jsp页面也翻译成为java代码
2、动态包含底层代码使用如下去调用被包含的jsp页面执行输出
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
3、动态包含,还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>footer.jsp</title>
</head>
<body>
页脚信息 <br>
<%=request.getParameter("password")%>
</body>
</html>
- 一般用jsp只是输出页面数据,不会有太复杂代码,因此一般使用的是 静态包含
常用标签之 请求转发
练习一 :在jsp页面中输出九九乘法口诀表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<% for (int i = 1; i <= 9; i ++ ) { %>
<tr>
<% for (int j = 1; j <= i; j ++ ) { %>
<td><%= j + "x" + i + "=" + (i * j)%></td>
<% } %>
</tr>
<% } %>
</table>
</body>
</html>
练习二 :遍历输出十个学生信息到表格中
package com.atguigu.pojo;
public class Student {
private Integer id;
private String name;
private Integer age;
private String phone;
// 构造器(无参 + 全参)+ Getter+Setter + toString
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + ''' +
", age=" + age +
", phone='" + phone + ''' +
'}';
}
public Student(Integer id, String name, Integer age, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.phone = phone;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Student() {
}
}
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table {
border: 1px pink solid;
width: 600px;
border-collapse: collapse;
}
td, th {
border: 1px pink solid;
}
</style>
</head>
<body>
<%
List<Student> studentList = new ArrayList<Student>();
for (int i = 0; i < 10; i++) {
int t = i + 1;
studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));
}
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<% for (Student student : studentList) { %>
<tr>
<td><%=student.getId() %></td>
<td><%=student.getName()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getPhone()%></td>
<td>操作、修改</td>
</tr>
<% } %>
</table>
</body>
</html>
请求转发的使用说明
请求转发的使用 :
- servlet程序其实是不太适合回传html数据给后端的,比较麻烦,而是jsp页面比较适合干这件事
- 因此,我们把这件事交给jsp,专门用来显示学生信息
- 那么,我们就需要serlet和jsp共同完成这件事情,
- 因此,需要 请求转发,刚好请求转发共享request域数据
package com.atguigu.pojo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SearchStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的参数
// 发sql语句查询学生的信息
// 使用for循环生成查询到的数据做模拟
List<Student> studentList = new ArrayList<Student>();
for (int i = 0; i < 10; i++) {
int t = i + 1;
studentList.add(new Student(t, "name" + t, 18 + t, "phone" + t));
}
// 保存查询到的结果(学生信息)到request域中
req.setAttribute("stuList", studentList);
// 请求转发到 showStudent.jsp页面
req.getRequestDispatcher("/test/showStudent.jsp").forward(req, resp);
}
}
<%@ page import="com.atguigu.pojo.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table {
border: 1px pink solid;
width: 600px;
border-collapse: collapse;
}
td, th {
border: 1px pink solid;
}
</style>
</head>
<body>
<%
List<Student> studentList = (List<Student>) request.getAttribute("stuList");
%>
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
<td>操作</td>
</tr>
<% for (Student student : studentList) { %>
<tr>
<td><%=student.getId() %></td>
<td><%=student.getName()%></td>
<td><%=student.getAge()%></td>
<td><%=student.getPhone()%></td>
<td>操作、修改</td>
</tr>
<% } %>
</table>
</body>
</html>
- 注意,写完代码以后直接访问showStudent.jsp会 空指针异常
- 因为,我们直接访问jsp页面,没有经过servlet程序,还没有数据
- 所以,访问的时候一定要先访问这个servlet
- 记得给这个servlet加上地址
什么是Listener监听器
ServletContextListener监听器
package com.atguigu.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListenerImpl implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>SearchStudentServlet</servlet-name>
<servlet-class>com.atguigu.pojo.SearchStudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SearchStudentServlet</servlet-name>
<url-pattern>/searchStudentServlet</url-pattern>
</servlet-mapping>
<!-- 配置监听器-->
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>
</web-app>
最后
以上就是威武自行车为你收集整理的尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)书城项目JSP的全部内容,希望文章能够帮你解决尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(二)书城项目JSP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复