jsp,mvc架构

概述

Java Server Pages:和servlet一样,用于动态web技术

Jsp原理

D:\apache-tomcat-9.0.29\work\Catalina\localhost\ROOT\org\apache\jsp下有index_jsp.java,其中代码HttpJspBase类是extends HttpServlet类。idea中使用tomcat会在idea中tomcat生产work目录

浏览器向服务器发送请求,不管访问什么资源,其实就是在访问Servlet.

Jsp本质就是Servlet

	//初始化
    public void _jspInit() {
    }

	//销毁
    protected void _jspDestroy() {
    }

    @Override
    public abstract void _jspService(HttpServletRequest request,
                                     HttpServletResponse response)
        throws ServletException, IOException;
  1. 判断请求

  2. 内置对象

        final javax.servlet.jsp.PageContext pageContext;//页面上下文
        final javax.servlet.ServletContext application;//application
        final javax.servlet.ServletConfig config;//config
        javax.servlet.jsp.JspWriter out = null;//out
        final java.lang.Object page = this;//当前页
     	request//请求
        response//响应
        session
        exception
    
  3. 输出页面前的代码

    response.setContentType("text/html; charset=UTF-8");
          pageContext = _jspxFactory.getPageContext(this, request, response,
          			null, false, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          out = pageContext.getOut();
          _jspx_out = out;
    
  4. 以上对象可以在jsp页面直接使用

  5. 如果是java代码,jsp转servlet就会原封不动转化,如果是html。就会用out.write()

基础语法

依赖
    <dependencies>
        <!-- servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <!-- jsp -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>

        <!-- jstl表达式 -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- standard标签库 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
jsp表达式
  • 语法

    <%= new Date()%>	<%= 变量或表达式>
    <% %>	脚本片段
    <%! %>	jsp声明
    <%----%>	jsp注释 jsp注释不会在客户端显示,而html注释会
    
  • jsp脚本片段

    <%
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum = sum + i;
        }
        out.println("<h1>sum=" + sum + "</h1>");
    %>
    
  • jsp脚本片段再实现

    <%
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum = sum + i;
        }
        out.println("<h1>sum=" + sum + "</h1>");
    %>
    
  • jsp声明

    会被编译到jsp生成的java类中,其它会被生成到_jspService中

    <%--会被编译到jsp生成的java类中,其它会被生成到_jspService中--%>
    <%!
        static {
            System.out.println("loading servlet");
        }
    
        private int globalVar = 0;
    
        public void test(){
            System.out.println("进入方法test");
        }
    %>
    
jsp指令
错误页面
  • web.xml配置

    <error-page>
    	<error-code>404</error-code>
    	<location>/404.jsp</location>
    </error-page>
    
    <error-page>
    	<error-code>500</error-code>
    	<location>/500.jsp</location>
    </error-page>
    
  • jsp页面声明

    <%@ page errorPage="404.jsp" %>
    
  • include拼接

    <%--1.会将两个页面合二为一--%>
    <%@ include file="404.jsp"%>
    <h1>hello</h1>
    <%@ include file="500.jsp"%>
    
    <%--2.本质还是两个页面--%>
    <jsp:include page="404.jsp"/>
    <h1>hello</h1>
    <jsp:include page="500.jsp"/>>
    

    总结:第一种写法时,拼接的两个页面都声明了同一个变量,页面就会500错误。第二中书写时就会报错。所以推荐第二种写法

内置对象
  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application[ServletContext] 存东西
  • config[ServletConfig]
  • out
  • page
  • exception
作用域

application>session>request>pageContext

<%
pageContext.setAttribute("name1", "1号",PageContext.SESSION_SCOPE);
//等价于
session.setAttribute("name1", "1号");
%>

jsp标签,jstl标签,el表达式

jsp标签
<%--1.请求转发:坑:jsp:forward里面不要写注释--%>
<%--jsp:param:在请求里放参数--%>
<jsp:forward page="/jsptag1.jsp">
    <jsp:param name="name" value="sz"/>
</jsp:forward>


<%--javaBean--%>
<%--javaBean--%>
<jsp:useBean id="user" class="com.moral.entity.User" scope="page"/>
<jsp:setProperty name="user" property="name" value="jpy"/>
name:<jsp:getProperty name="user" property="name"/>
等价于:
User user=new User();
user.setName("jpy");

<%--2.取参--%>
<%--取参--%>
<%= request.getParameter("name")%>
${param.name}

resuqestScope和requst

  • ${requestScope.name} 等价于 request.getAttribute("name")
  • request.getParameter("name")等价于parm.name
jstl标签

弥补html标签的不足,有很多自定义标签,标签功能和java代码一样

  • 核心标签 <c
  • 格式化标签 <fmt
  • sql标签 <sql
  • xml标签 <x
  • jstl函数 <fn

如果tomcat中没有jstl和standard包,也需要导入jstl和standard的jar包

<%--引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • if

    <form action="jstl.jsp" method="get">
        <label>
            <input type="text" name="username" value="${param.username}">
        </label>
        <input type="submit" value="登陆">
    </form>
    
    <c:if test="${param.username=='admin'}" var="isAdmin">
        <c:out value="欢迎你${param.username}"/>
    </c:if>
    <c:out value="${param.username}"/>
    <c:out value="${isAdmin}"/>
    
  • foreach

    <%
        ArrayList<Integer> nums = new ArrayList<Integer>();
        nums.add(1);
        nums.add(2);
        nums.add(3);
        request.setAttribute("nums", nums);
    %>
    <br>
    <c:forEach var="num" items="${nums}">
        <c:out value="${num}"/><br>
    </c:forEach>
    

MVC概述

架构模式,模型(Model)、视图(View)、控制器(Controller),降低了视图与业务逻辑间的双向偶合

Model
  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)
View
  • 展示数据
  • 提供连接发起Servlet请求(a,form ,img...)
Controller(Servlet)
  • 接收客户请求:(request:请求参数,Session信息...)

  • 交给业务层处理对应的代码

  • 控制视图跳转

    登陆----》接收登陆请求---》Controller处理请求(获取登陆参数)---》业务层处理(判断用户名和密码:事务)---》Dao层(查询用户名和密码是否正确)

posted @   jpy  阅读(35)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示