MVC (Model View Control)
web应用程序Servlet
 编译
jsp技术的初衷 为了方便生成动态页面
jsp与servlet的区别
jsp的特征:
jsp也是一个servlet 与自己的servlet有些区别
1.与servlet使用的类型 继承关系有区别 但是结构类似
2.通过jsp-api.jar 翻译成 java文件 编译成class文件运行
3.访问地址 根据原文件所在地址虚拟出来的 有服务器自动配置
// servlet使用的是虚拟路径 前缀 后缀都可以加 /myfolder/demo.jsp
@WebServlet("/myfolder/demo.jsp")
jsp代码结构特征
代码结构 java + html css javascript
用特殊标记 直接写
jsp中java代码的写法:
1.<% %> java脚本
2.<%= %> 输出到页面
3.<%@ 指令名 指令参数%>
page 做页面参数设置
include 组合页面
//taglib
4.<%-- --% > jsp注释
示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<style>
h1{color: red}
</style>
</head>
<body>
$END$
String a = "abc";
<%String a = "zzzz";
System.out.println(a);
out.print(a);
%>
<%=a %>
<h1>你还要</h1>
<%@ include file="testPage.jsp"%>
</body><script>
console.log(123)
</script>
</html>
jsp内置对象 作用域
jsp9种内置对象
jsp源文件中没有 但是可以直接使用的对象(翻译的java文件中会生成的对象)
request
response
session
application
config
out
page
pageContext
exception
jsp4种作用域
域对象
page
request
session
application
el表达式 简化jsp页面中的取值并输出场景
${key} 域中的key
作用域隐式对象
pageScope
requestScope
sessionScope
applicationScope
参数访问对象
param
paramValue
页面上下文隐式对象
pageContext
可以简化取值输出
<%--<h1>欢迎你 <% String user =(String) session.getAttribute("loginUser");out.print(user); %></h1>--%>
<h1>欢迎你${sessionScope.loginUser} </h1>
<h3>欢迎你${param.username} </h3>
<a href="/$%7BpageContext.request.contextPath%7D/xxx">连接地址</a>
2MVC
M数据 V视图 C 控制
通过C控制层,调用数据处理,并选择数据在哪个视图展示
// M数据 V视图 C 控制
// 代码三层结构 service jsp servlet
// dao
// 实体类
3.servlet与jsp组合使用
先由Servlet处理数据 ,再由jsp负责数据显示
需要从servlet跳转到jsp
两种跳转方式
//获得请求转发器 前进
req.getRequestDispatcher("/QueryUserJsp.jsp").forward(req,resp);
* 转发(请求转发)
* 服务器内部跳转 浏览器只做一次请求
* 请求地址落在了第一次请求的地址上
* 可以通过request共享数据
* 路径格式 自有规则
* 相对路径 规则相同
* 相对根路径 /xxx.jsp 自动补全项目名 /项目名/xxx.jsp
*
//通知浏览器 重定向访问
resp.sendRedirect("/day11/QueryUserJsp.jsp");
* 重定向
* 响应码302
多了响应头 Location: QueryUserJsp.jsp
浏览器接到这种响应 会向location指向的地址重新发送请求
*
* 发送两次请求
* 请求地址落在了第二次请求的地址上
* 无法通过request共享数据 需要通过session serveltContext共享数据
* 路径格式 使用html中的访问路径
* 相对路径 相对根路径 绝对路径
示例:
package com.javasm.controller;
import com.javasm.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
/**
* @author gfs
* @version 0.1
* @className QueryUserServlet
* @descriptioin:
* @date 2024/11/21 10:47
* @since jdk11
*/
@WebServlet("/queryUser")
public class QueryUserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//从数据库查出了用户列表
ArrayList
<User> listUser = new ArrayList<>();
listUser.add(new User(1l,"jack","abc123",15));
listUser.add(new User(2l,"jack2","abc123",17));
listUser.add(new User(3l,"jack3","abc123",88));
/*
* 跳转方式:
* 转发(请求转发)
* 服务器内部跳转 浏览器只做一次请求
* 请求地址落在了第一次请求的地址上
* 可以通过request共享数据
* 路径格式 自有规则
* 相对路径 规则相同
* 相对根路径 /xxx.jsp 自动补全项目名 /项目名/xxx.jsp
*
* 重定向
* 响应码302 多了响应头 Location: QueryUserJsp.jsp 浏览器接到这种响应 会向location指向的地址重新发送请求
*
* 发送两次请求
* 请求地址落在了第二次请求的地址上
* 无法通过request共享数据 需要通过session serveltContext共享数据
* 路径格式 使用html中的访问路径
* 相对路径 相对根路径 绝对路径
*
*
*
*
*
* */
//请求转发
//通过域对象共享数据
//HttpSession session = req.getSession();
//session.setAttribute("listUser",listUser);
req.setAttribute("listUser",listUser);
req.getRequestDispatcher("/QueryUserJsp.jsp").forward(req,resp);
//响应重定向
//
//resp.sendRedirect("/day11/QueryUserJsp.jsp");
}
}
页面文件:
<%@ page import="com.javasm.entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/11/21
Time: 10:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
</tr>
<%
List
<User> listUser1 =(List<User>) request.getAttribute("listUser");
// List
<User> listUser1 =(List<User>) session.getAttribute("listUser");
List
<User> listUser = listUser1;
// ArrayList
<User> listUser = new ArrayList<>();
// listUser.add(new User(1l,"jack","abc123",15));
// listUser.add(new User(2l,"jack2","abc123",17));
// listUser.add(new User(3l,"jack3","abc123",88));
if(listUser!=null){
for(User user:listUser){%>
<tr>
<td><%=user.getId()%></td>
<td><%=user.getUsername()%></td>
<td><%=user.getPassword()%></td>
<td><%=user.getAge()%></td>
</tr>
<% }}
%>
</table>
</body>
</html>
转发和重定向运行方式

servlet处理数据 jsp要显示 下次请求时数据可能不一样
选择请求转发
2.两个处理单元 没有直接数据关联
转发和重定向 都可以
3.界面是否会频繁刷新
如果没有直接数据关联 并会被多次刷新 最好选择重定向 前边的servlet不会重复触发