首页 > 编程语言 >熟悉又陌生的JavaWeb 第2天

熟悉又陌生的JavaWeb 第2天

时间:2024-03-07 16:36:28浏览次数:33  
标签:JavaWeb JSP connection api jsp 熟悉 陌生 servlet out

传送门

JSP基本语法

什么是servlet
servlet的java代码

自定义Servlet,直接使用抽象好的HttpServlet更好

HttpServlet的java代码

MyCustomServlet

public class MyCustomServlet extends HttpServlet {

    @Serial
    private static final long serialVersionUID = -599450886992695746L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (LocalTime.now().getSecond()%2==0){
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter out = resp.getWriter();
            out.println("<html><body bgcolor= #ffccff>");
            out.println("<h1>hello servlet,你好 servlet</h1>");
            out.println("</body></html>");
        }else {
            resp.setContentType("application/json;charset=UTF-8");
            PrintWriter out = resp.getWriter();
            resp.setStatus(HttpServletResponse.SC_BAD_GATEWAY);
            out.println("""
                    {"code":502,"msg":"服务器错误啦"}
                    """);
        }

    }
}

web.xml

    <servlet>
        <servlet-name>MyCustomServlet</servlet-name>
        <servlet-class>com.lazyking.MyCustomServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyCustomServlet</servlet-name>
        <url-pattern>/customServlet</url-pattern>
    </servlet-mapping>

jsp运行原理
jsp运行原理

<% out.print("welcome") %>

IDEA Jetty启动 out对象不能识别怎么办?(也就是out.print报红)
其实是因为缺少servlet-api,大部分教程是告诉你引入tomcat作为编译依赖的一部分,其实直接pom引入servlet-api和jsp-api就可以了
这里为了方便直接引用了jstl(它包含了api),后续jstl表达式能大大简化开发

jstl

同时还需要引入taglibs,为的是让IDEA支持JSTL的代码补全,否则c:set标签等虽然可以使用,但会报红影响开发

需要注意依赖的scope都要改为provided,因为我们只在编写编译代码时需要使用依赖,实际使用时Web容器会提供这些依赖

引入多余的话会出现WARNING:scanned from multiple locations 类似这样的提示

        <!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp/jakarta.servlet.jsp-api -->
        <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
            <scope>provided</scope>
        </dependency>
        

第一个JSP页面


<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<p>Hello JSP!</p>
<%
    out.print("welcome");

    String msg = "这是一个字符串";
    List<Integer> list = List.of(1, 2, 3, 4, 5);
%>
<p>Hello GO GO GO!</p>

<%= "msg is " + msg + " list is " + list %>

</body>
</html>

注释

JSP表达式

JSP程序段

JSP声明

可以随处声明,但不常用,有点不符合Java的风格了

<%="value is " + value %>
<%
    student.setName("111");
%>
<br>
<%="student is " + student%>
<br>
<%="studentNull is " + studentNull%>
<%!
   String value = "像JavaScript那样随处声明";
   Student student = new Student(1,"小明");
   Student studentNull;
%>

<%
    for (int i = 0; i < 5; i++) {
%>
    <p> 跨Java区域中间添加HTML代码,但是非常不美观 </p>
<%
    }
%>

URL传值

<%
    String no = request.getParameter("no");
%>

JSP指令和动作

jsp基本头部标签

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<%@ page import="java.util.List,java.util.ArrayList" %>
<%@ page import="com.lazyking.Student" %>

<%@ page errorPage="/error/error.jsp" %>

//error.jsp
<%@ page isErrorPage="true" %>

jsp错误页面示例

<%@ page import="java.util.Date" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isErrorPage="true" %>
<html>
<head>
    <title>Title</title>

    <%
        request.setAttribute("exceptionC",exception);
        request.setAttribute("myDate",new Date());
        out.println("页面出问题了!" + exception.getMessage());
    %>
    <br>
    request.setAttribute exceptionC: <c:out value="${exceptionC}"></c:out>
    <br>
    <c:set var="ss" value="AABB"></c:set>
    fn:toLowerCase: <c:out value="${fn:toLowerCase(ss)}"></c:out>
    <br>
    <fmt:parseDate value="2024-03-06" var="parsedDate" pattern="yyyy-MM-dd" />
    <fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd HH:mm:ss" var="formattedDate" />
    parsedDate: <c:out value="${parsedDate}"></c:out>
    <br>
    formattedDate: ${formattedDate} <c:out value="${formattedDate}"></c:out>
    <br>
    
<%--    <sql:query var=""></sql:query>--%>
    
</head>
<body>

</body>
</html>


详情可以查看jsp的xml规范
jspdirectives

jsp包含,常用,include其他jsp文件作为网页头或者网页脚

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<hr>
<p>我是foot.jsp 其他jsp记得在最后include我</p>

<%@ include file="/foot.jsp"%>
<jsp:include page="/foot.jsp" />
<p>@ include 会复制整个jsp的代码嵌入 </p>
<p>jsp:include 只复制jsp的输出页面结果而非jsp代码 建议jsp的文件用这种 避免变量名冲突</p>

jsp转发

<jsp:forward page="go.jsp"></jsp:forward>

课后习题

表单开发

注意一下多选框元素的获取就可以

    String no = request.getParameter("no");
    String[] checkboxes = request.getParameterValues("checkbox");

认识表单

单一表单元素数据

捆绑表单元素数据

隐藏表单

其他问题

课后习题

JSP访问数据库

好久没有这么原始的调用数据库了


    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
    Connection connection = DriverManager.getConnection("url","user","pwd");
    try {
        try (
             PreparedStatement ps = connection.prepareStatement("select sql from table where name=?");
             PreparedStatement psUpdate = connection.prepareStatement("update table set name=? where no=?");
        ){
            connection.setAutoCommit(false);
            //事务
            ps.setString(1,"小明");
            try (ResultSet resultSet = ps.executeQuery();){
                while (resultSet.next()) {
                    String no = resultSet.getString("no");
                }
            }

            psUpdate.setString(1,"小明");
            psUpdate.setString(2,"2");
            int update = psUpdate.executeUpdate();
            connection.commit();
        }
    }catch (Exception e){
        connection.rollback();
        throw new RuntimeException(e);
    }finally {
        if (connection != null){
            connection.close();
        }
    }

JDBC

建立ODBC数据源

JDBC操作

使用PreparedStatement

事务

使用厂商驱动进行数据库连接

课后习题

JSP内置对象

可以通过查看编译后的Servlet class更直观的了解jsp内置对象
指定一下Jetty的临时目录

                <configuration>
                    <httpConnector>
                        <port>9999</port>
                        <host>localhost</host>
                    </httpConnector>
                    <webApp>
                        <contextPath>/</contextPath> <!-- Web 应用的上下文路径 -->
                        <tempDirectory>D:\jettyTemp</tempDirectory><!--web文件临时目录 -->
                    </webApp>
                    <scan>10</scan>
                </configuration>

jetty_temp

认识JSP内置对象

如源代码所示

jsp转换servlet源码示例

内置对象的类可以在serlvet-api的jar包内看到具体内容

内置对象

out对象

request对象

response对象

//重定向
response.sendRedirect("xxx.jsp");
//与<jsp:forward>的区别是,sendRedirect相当于浏览器重新请求,使用的是新的地址,request的数据不能共享

Cookie操作

利用Session开发购物车

session的其他API

application对象

其他对象

课后习题

标签:JavaWeb,JSP,connection,api,jsp,熟悉,陌生,servlet,out
From: https://www.cnblogs.com/lazykingloveu/p/18059191

相关文章

  • 关于Maven创建javaweb项目在配置Tomcat的问题(1)
    先将Maven项目转换成Java项目,确保没有架包没有报错和编译错误的情况下进行如下操作:打开Maven项目中的pom.xml文件,找到标签。查看里面是否配置元素,有则直接添加如下配置。org.codehaus.cargocargo-maven2-plugin1.7.6tomcat9xembedded如果没有,则先添加元素,然后再添加......
  • javaweb04-maven&web入门
    maven依赖管理:管理项目依赖的jar包,避免版本冲突统一项目结构:提供标准统一的项目结构标准的项目构建:标准跨平台的自动化项目构建方式maven坐标groupid:定义当前项目隶属组织名称artifactid:定义当前项目名称version:定义当前项目版本号依赖依赖传递排除依赖<exclusion>......
  • javaweb03-前端工程
    Ajax异步的Javascript和XML数据交换异步交互:在不重载页面的情况下,与服务器交换数据并更新部分网页Axios入门前后端分离开发需求分析->接口定义->前后端并行开发->测试->前后端联调开发YAPI接口管理平台前端工程化规范化、标准化前端开发环境准备vue-cli脚手架Vu......
  • 3.1日javaweb
     今天继续进行项目的编写packagecom.example.service;importcom.example.mapper.UserMapper;importcom.example.pojo.Application;importcom.example.pojo.Plan;importcom.example.pojo.User;importorg.springframework.beans.factory.annotation.Autowired;impo......
  • JavaWeb
    JavaWebJavaWeb组件首先献上Tomcat架构神图:ServletServlet容器:运行在Web服务器上的程序,作为来自HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层,它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。​ 大体原理图如下:Servlet请求的处理......
  • 黑马程序员JavaWeb学习笔记-过滤器
    过滤器--Filter过滤器Filter快速入门Filter拦截路径过滤器链Filter——流程importcom.alibaba.fastjson.JSONObject;importcom.itheima.pojo.Result;importlombok.extern.slf4j.Slf4j;importorg.springframework.util.StringUtils;importjavax.servlet.*;im......
  • 黑马程序员JavaWeb学习笔记-拦截器
    拦截器--Interceptor--快速入门@Component注解交给ioc容器管理--注册配置拦截器@Configuration注解用来标识当前是Spring当中的一个配置类//Interceptor拦截所有("/**")//Filter拦截所有("/*")//WebConfig需要在包下新建一个config包与controller同级//.excl......
  • 黑马程序员JavaWeb学习笔记-文件上传
    文件上传https://www.bilibili.com/video/BV1m84y1w7Tb/?p=150&spm_id_from=pageDriver&vd_source=62f4901d4d947272c439194b87ec6698当报错500时,服务端出现错误,因为默认最大为1M在application.properties里面修改文件上传的几个函数本地存储Controller层的代码import......
  • 黑马程序员JavaWeb学习笔记-登陆login
    登陆loginlogin是登陆业务方法,mapper接口是持久层,用来操作数据库的,用业务方法名不合适三层架构PostMan测试登陆校验http协议是无状态的,下次请求不会携带上次请求的数据,两次请求是独立的Cookie前后端分离项目中前端页面和后段接口部署在不同的服务器上,所以他们的协议......
  • 黑马程序员JavaWeb学习笔记-JavaScript
    JavaScript--JavaScript引入方式--书写语法--输出语句window可以省略--变量var特点1:作用域比较大,全局变量特点2:可以重复定义--数据类型原始数据类型相当于java中基础数据类型alert(parseInt("12"));//12alert(parseInt("12A45"));//12alert(parseInt("A4......