java学习day33---servlet(中)

由于使用serlvet生成html标签,代码难以维护,可读性差,容易出错,所以引入jsp,用于生成HTML标签

1. jsp
java server page
用途:主要用来生成html标签

在表现形式上类似于html 但多了一行

<%@ page contentType="text/html;charset=utf-8" %>

上面的代码称为 page 指令,主要作用就是指明此页面是一个jsp页面,并且通过contentType说明他的字符编码和格式
jsp 中有 
   1). 指令: `<%@ 指令名 %>`
   2). 脚本:  `<%  可以是任意java代码  %>`
   3). 表达式: `<%= 表达式 %>` 把执行结果显示在页面上

<%--
  Created by IntelliJ IDEA.
  User: Szy
  Date: 2018/10/15
  Time: 15:54
  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>
<%-- 下面是jsp脚本,用于写java代码 --%>
    <%
        int i = 10;
        java.util.Date date = new java.util.Date();
    %>
<%-- jsp表达式 --%>
    <%= i%>
    <br>
    <%= date%>
</body>
</html>

运行结果:

2. el表达式语言
expression language 在jsp用来展示结果的语言
语法     ${ 表达式语言 }

要用el表达式显示复杂的内容,需要把内容提前放入`作用域`, el再从`作用域`中把内容取出来显示
   pageContext.setAttribute("名称", Object); // 把内容起一个名字放入作用域

   使用通过EL表达式       ${pageScope.名称}      进行调用

el表达式可以通过
${对象.属性名} 但这里的属性名,依据是对象的get方法,而不是私有属性名
把get方法中get去掉(或把is方法的is去掉),剩余的单词首字母小写,作为对象的属性名,例如

getName() ==> name
getUsername() ==> username
getHelloWorld() ==> helloWorld
isClose()  ==>  close

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2018/9/9
  Time: 16:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,westos.Dept" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- ctrl+shift+/ -->
    <%--<%
        List<Dept> list = new ArrayList<>();
        list.add(new Dept(10, "部门1", "北京"));
        list.add(new Dept(20, "部门2", "天津"));
        list.add(new Dept(30, "部门3", "上海"));
        list.add(new Dept(40, "部门4", "西安"));
        // 将集合放入作用域
        pageContext.setAttribute("list", list);
    %>--%>

    <!-- 4)利用标签和el表达式显示数据 -->
    <table border="1" width="100%">
        <tbody>
        <c:forEach items="${aaa}" var="d">
            <tr>
                <td>${d.deptno}</td>
                <td>${d.name}</td>
                <td>${d.loc}</td>
            </tr>
        </c:forEach>
        </tbody>
    </table>
</body>
</html>

运行结果:

3. JSTL
java 标准标签库
java standard tag library

主要的工具就是配合el表达式,实现循环,条件判断等功能
前提: 加入jstl-1.2的jar包,先将jar包复制在Web中,然后在Project Structure中设置导入,设置如下图

然后点击Atifacts,点击右下角的fix,将其添加

导入标签库

<%@ taglib uri="标签库唯一标识" prefix="前缀" %>

4.控制语句

forEach

<c:forEach items="要遍历的集合" var="临时变量名" begin="起始数字" end="结束数字">
    ${临时变量名}
</c:forEach>

要遍历的集合 必须使用${} 从作用域获取

if

<c:if test="布尔条件">内容</c:if>

5. MVC 思想
Model 模型 ==>  数据(例如从数据库查询出来的list集合, 里面包含java对象)
View  视图 ==>  数据的展现形式 (jsp就是一种视图技术)
Controller 控制器 ==> 把模型和视图联系起来 (servlet 充当控制器作用)

由servlet器查询数据,把数据放入作用域,跳转至jsp视图
jsp视图从作用域中获取数据,并展示

下面演示用servlet从数据库中读取数据,跳转到jsp页面上显示(Student部分代码略过,含私有属性,有参构造和get/set方法)

还有删除,增添,修改等功能步骤类似,不在赘述

package level1;

import util.Utils;

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 java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(urlPatterns = "/ServletToJspTest1")
public class ServletToJspTest1 extends HttpServlet {
    static {   //只需要执行一次,所以放在静态代码块里面
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Connection conn =null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = Utils.getConnection();
            stmt = conn.prepareStatement("select * from student");
            rs = stmt.executeQuery();

            List<Student> list = new ArrayList<>();  //创建一个集合存储Student对象
            while(rs.next()) {  //将对象添加到list集合中
                list.add(new Student(
                        rs.getInt("sid"),
                        rs.getString("sname"),
                        rs.getString("birthday"),
                        rs.getString("sex")
                ));
            }

            //将list集合放入作用域
            req.setAttribute("aaa", list);

            //跳转请求控制台到jsp页面,让jsp页面完成显示功能
            req.getRequestDispatcher("ReceiveReqTest1.jsp").forward(req, resp);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            Utils.close(rs, stmt, conn);
        }
    }
}
<%--
  Created by IntelliJ IDEA.
  User: Szy
  Date: 2018/10/15
  Time: 15:54
  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>
<%-- 下面是jsp脚本,用于写java代码 --%>
    <%
        int i = 10;
        java.util.Date date = new java.util.Date();
    %>
<%-- jsp表达式 --%>
    <%= i%>
    <br>
    <%= date%>
<%-- el表达式 --%>
    ${10} <br>
    ${"我是字符串"} <br>
    ${date} <br>
</body>
</html>

运行结果:注意地址是servlet的地址,而非直接访问jsp页面

> 注意: 服务器常见的错误类型
500 Internal Server Error 服务器内部错误,由于应用程序自己没有正确处理异常,异常抛给了tomcat,这时就会出现500
404 Not Found 资源未找到错误,发生于要访问的资源不存在(资源可能是servlet, jsp, html)
405 Method Not Allowed 方法不支持,
    当没有覆盖doGet但发送了get请求时
    当没有覆盖doPost但发送了post请求时
200 OK 表示这次请求正常,没有错误
304 这个文件没有修改,请浏览器使用上一次缓存的文件

这些数字称为响应状态码

猜你喜欢

转载自blog.csdn.net/szy2333/article/details/82806362