# MVC (Model View Control)
web应用程序Servlet
 编译
“`
jsp技术的初衷 为了方便生成动态页面
#### jsp与servlet的区别
“`java
jsp的特征:
jsp也是一个servlet 与自己的servlet有些区别
1.与servlet使用的类型 继承关系有区别 但是结构类似
2.通过jsp-api.jar 翻译成 java文件 编译成class文件运行
3.访问地址 根据原文件所在地址虚拟出来的 有服务器自动配置
// servlet使用的是虚拟路径 前缀 后缀都可以加 /myfolder/demo.jsp
@WebServlet("/myfolder/demo.jsp")
“`
#### jsp代码结构特征
“`java
代码结构 java + html css javascript
用特殊标记 直接写
“`
“`
jsp中java代码的写法:
1.<% %> java脚本
2.<%= %> 输出到页面
3.<%@ 指令名 指令参数%>
page 做页面参数设置
include 组合页面
//taglib
4.<%– –% > jsp注释
“`
###### 示例:
“`jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$END$
String a = “abc”;
<%String a = "zzzz"; System.out.println(a); out.print(a); %>
<%=a %>
你还要
<%@ include file="testPage.jsp"%>
“`
#### 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
“`
“`jsp
可以简化取值输出
<%--
欢迎你 <% String user =(String) session.getAttribute("loginUser");out.print(user); %>
–%>
欢迎你${sessionScope.loginUser}
欢迎你${param.username}
连接地址
“`
## 2MVC
M数据 V视图 C 控制
通过C控制层,调用数据处理,并选择数据在哪个视图展示
“`
// M数据 V视图 C 控制
// 代码三层结构 service jsp servlet
// dao
// 实体类
“`
## 3.servlet与jsp组合使用
先由Servlet处理数据 ,再由jsp负责数据显示
需要从servlet跳转到jsp
两种跳转方式
“`java
//获得请求转发器 前进
req.getRequestDispatcher(“/QueryUserJsp.jsp”).forward(req,resp);
“`
“`java
* 转发(请求转发)
* 服务器内部跳转 浏览器只做一次请求
* 请求地址落在了第一次请求的地址上
* 可以通过request共享数据
* 路径格式 自有规则
* 相对路径 规则相同
* 相对根路径 /xxx.jsp 自动补全项目名 /项目名/xxx.jsp
*
“`
“`java
//通知浏览器 重定向访问
resp.sendRedirect(“/day11/QueryUserJsp.jsp”);
“`
“`java
* 重定向
* 响应码302
多了响应头 Location: QueryUserJsp.jsp
浏览器接到这种响应 会向location指向的地址重新发送请求
*
* 发送两次请求
* 请求地址落在了第二次请求的地址上
* 无法通过request共享数据 需要通过session serveltContext共享数据
* 路径格式 使用html中的访问路径
* 相对路径 相对根路径 绝对路径
“`
###### 示例:
“`java
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
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”);
}
}
“`
页面文件:
“`java
<%@ 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" %>
| 编号 | 姓名 | 密码 | 年龄 |
|---|---|---|---|
| <%=user.getId()%> | <%=user.getUsername()%> | <%=user.getPassword()%> | <%=user.getAge()%> |
“`
转发和重定向运行方式

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