MVC & jsp 相关技术

# MVC (Model View Control)

web应用程序Servlet

![image-20241121093050508](http://43.155.216.63:21080/wp-content/uploads/2025/12/image-20241121093050508.png

## 1.jsp技术

### jsp本质就是servlet

“`
jsp源文件不会直接执行 是一种模版引擎 有转化的过程

xxx.jsp ———–> xxx_jsp.java ——–> xxx_jsp.class 执行
通过jsp-api.jar 转化代码 (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" %>


$Title$



$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 = 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”);

}
}

“`

页面文件:

“`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" %>


Title

<% List listUser1 =(List) request.getAttribute(“listUser”);
// List listUser1 =(List) session.getAttribute(“listUser”);
List listUser = listUser1;
// ArrayList 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){%>

<% }} %>

编号 姓名 密码 年龄
<%=user.getId()%> <%=user.getUsername()%> <%=user.getPassword()%> <%=user.getAge()%>


“`

转发和重定向运行方式

![image-20241121114021360](http://43.155.216.63:21080/wp-content/uploads/2025/12/image-20241121114021360.png

##### 实际使用时 根据什么标准选择使用转发/重定向

“`java
1.两个处理单元之间 有没有直接的数据关联(不需要长期存在的数据)
servlet处理数据 jsp要显示 下次请求时数据可能不一样
选择请求转发

2.两个处理单元 没有直接数据关联
转发和重定向 都可以

3.界面是否会频繁刷新
如果没有直接数据关联 并会被多次刷新 最好选择重定向 前边的servlet不会重复触发
“`

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇