jsp(Java server page)

1. jsp

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

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

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

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

## 2. EL表达式语言 expression language 在jsp用来展示结果的语言 语法 `${ 表达式语言 }` 要用el表达式显示复杂的内容,需要把内容提前放入`作用域`, el再从`作用域`中把内容取出来显示
</head>
<body>
<%
`<%    pageContext.setAttribute("number" ,1000);%>
%>
${number}
</body>
</html>
....
## 3. JSTL java 标准标签库 java standard tag library 主要的工具就是配合el表达式,实现循环,条件判断等功能 前提: 加入jstl-1.2的jar包 导入标签库

3.1 forEach

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

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="a" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<Object>  list = new ArrayList<>();
    list.add("项目1");
    list.add("项目2");
    list.add("项目3");
    list.add("项目4");
    pageContext.setAttribute("c1" ,list);

%>
<ul>
    <a:forEach items="${c1}" var="i">
        <li>${i}</li>
        </a:forEach>
</ul>
<a:forEach begin="1" end="10" var="i">
    <input type="button" value="${i}">
    </a:forEach>
<a:forEach begin="1" end="10" var="i">
    <a href="#" > ${i}</a>
</a:forEach>
</body>
</html>

3.2 if

<c:if test="布尔条件">内容</c:if>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="a" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<Object>  list = new ArrayList<>();
    list.add("项目1");
    list.add("项目2");
    list.add("项目3");
    list.add("项目4");
    pageContext.setAttribute("c1" ,list);
    %>
    <a:if test="${c1.size()==4}">
<ul>
    <a:forEach items="${c1}" var="i">
        <li>${i}</li>
        </a:forEach>
</ul>
 </a:if>
</body>
</html>

3.3 choose 类似于 if elseif else

语法:

<a:choose>
  <a:when test="条件1">内容1</a:when>
  <a:when test="条件2">内容2</a:when>
  ...
  <a:when test="条件n">内容n</a:when>
  <a:otherwise>以上条件都不成立时</a:otherwise>
</a:choose>
 req.setAttribute("salary", 8000.00);
<a:choose>
    <a:when test="${salary < 2000}">低收入</a:when>
    <a:when test="${salary >=2000 and salary <=5000}">中等收入</a:when>
    <%--<c:when test="${salary > 5000}">高收入</a:when>--%>
    <a:otherwise>高收入</c:otherwise>
</c:choose>

3.4 out 用来输出特殊内容

它可以对${}输出的内容进行控制,可以控制是否忽略html代码

req.setAttribute("text", "<span style='color:red;font-size:4em;'>文字</span>");
<a:out escapeXML="true" value="${作用域变量}"> 忽略html,(当做普通文本, 原样输出)
<a:out value="${text}" escapeXml="false"></a:out>(解析后输出)

3.5 fmt:formatDate(格式化日期)与fmt:formatNumber(格式化数字)(属于<%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt” %>标签库)

req.setAttribute("birthday", new Date());
req.setAttribute("number", 3333.45556666);
<fmt:formatDate value="${birthday}" pattern="yyyy-MM-dd HH:mm:ss.SSS"></fmt:formatDate>
<fmt:formatDate value="${birthday}" pattern="yyyy年MM月dd日"></fmt:formatDate>
<hr>
<fmt:formatNumber value="${number}" pattern="###,###.###"></fmt:formatNumber>
<fmt:formatNumber value="${number}" pattern="000,000.###"></fmt:formatNumber>

4. MVC 思想

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

由servlet器查询数据,把数据放入作用域,跳转至jsp视图
jsp视图从作用域中获取数据,并展示
查询为例:开发流程
Servlet: 执行查询

 public void service(HttpServletRequest request, HttpServletResponse response) {
    // 1) jdbc 代码,连接数据库,执行sql,查询结果
        // 2) 存入作用域
    request.setAttribute("变量名", 查询结果);

    // 3) 由servlet跳转至jsp                    转发
    request.getRequestDispatcher("目标jsp路径").forward(request, response);
}

jsp: 显示结果
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 4) 利用jstl标签和el表达式技术显示结果 -->
<c:if test="条件"></c:if>
<c:forEach items="${变量名}" var="临时变量名">  ${临时变量名} </c:forEach>

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

5. 如何接收各种不同表单参数

<form action="/s1" method="post">
    <!-- name 是参数名 -->
    <input type="date" name="birthday" value="2018-09-15">
    <hr><!-- MALE  FEMALE -->
    <input type="radio" name="sex" value="男" checked><input type="radio" name="sex" value="女">

    <hr>
    唱歌<input type="checkbox" name="hobby" value="1">
    跳舞<input type="checkbox" name="hobby" value="2">
    睡觉<input type="checkbox" name="hobby" value="3">
    玩游戏<input type="checkbox" name="hobby" value="4">

    <hr>
    <!-- option 标签如果不提供 value属性, 把标签之间的文本当成value
         如果提供了value属性,以value为准
    -->
    <select name="city">
        <option>北京</option>
        <option>天津</option>
        <option value="shanghai">上海</option>
        <option>武汉</option>
    </select>

    <hr>
    个人简介:
    <textarea name="intro" cols="30" rows="10"></textarea>
    <input type="submit" value="提交">
</form>
@WebServlet(urlPatterns = "/s1")
public class Servlet1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 处理汉字乱码
        req.setCharacterEncoding("utf-8");

        // 1) 日期类型的接收,需要注意转换字符串为java中的Date类型
        String birthday = req.getParameter("birthday");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(birthday);
            System.out.println(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 2) 处理单选按钮
        String sex = req.getParameter("sex");
        System.out.println(sex);

        // 3) 处理复选框, 注意处理null值(都没有勾选时,就是null值)
        String[] hobbies = req.getParameterValues("hobby");
//        System.out.println(Arrays.toString(hobbies));
        if(hobbies != null) {
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
        }

        // 4)处理下拉列表
        String city = req.getParameter("city");
        System.out.println(city);

        // 5)处理文本域
        String intro = req.getParameter("intro");
        System.out.println(intro);
    }
}

6 jsp 语法

6.1 jsp的脚本

<%
    任意java代码
%>

jsp的弊端在于当代码越来越多时,使用jsp脚本的方式,会造成项目代码难以维护
现在绝大多数公司都禁止在jsp出现脚本代码

6.2 jsp表达式 <%= 表达式 %>


  <%
        Connection conn = Utils.getConnection();
        PreparedStatement stmt = conn.prepareStatement("select * from dept");
        ResultSet rs = stmt.executeQuery();
        while(rs.next()) {
           System.out.println(rs.getInt("deptno") + " " +rs.getString("dname") +" "+rs.getString("loc"));
           out.println(rs.getInt("deptno") + " " +rs.getString("dname") +" "+rs.getString("loc")+"<br>");
    %>
    <%= rs.getString("dname") %> 
     <br/>
    <%
        }
        rs.close();
        stmt.close();
        conn.close();
    %>

作用是向页面显示值, 表达式不能以;结束

6.3 jsp指令(**)

<%@ page contentType="页面的内容类型和编码" 
    import="要导入的java类"
    isELIgnored="是否忽略EL表达式的处理" 
    errorPage="出现错误时,要跳转的页面"
    isErrorPage="用在错误页面上,取值为true表示是错误页面,这时候才能在页面中使用exception变量"
    %>
<%@ include file="另一个jsp页面" %>

作用,重用页面上的一些标签和代码

3.4 jsp声明

<%! 
    可以声明变量和方法
%>

jsp的原理:

jsp 要工作,也必须编译为java类

public class 类名 extends HttpJspBase{ // HttpJspBase 又是继承了HttpServlet

    public int i = 100;

    public int sum(int a, int b) {
        return a+b;
    }

    public void _jspService(HttpServletRequest request,
        HttpServletResponse response) {
        int i = 10;

        out.println(i++);
    }
}

1) 当首次访问此jsp时,tomcat会把jsp转译为*.java的类(间接继承自HttpServlet)
2) 再把.java类编译为.class字节码
3) 把加载到虚拟机执行,生命周期类似于servlet的生命周期

jsp的本质仍是一个servlet

        int i = 100; //  在声明部分的i变量, 是实例变量(优先级低于局部变量)

        public int sum(int a , int b) {
            return a +b;
        }
  %>
  <%
        int i = 10; //  在脚本部分的i变量, 是一个局部变量
  %>
  <%
     out.print(i);
   %>
  <%= i++ %> <!-- 如果是声明中的i,每次请求会不断增长(100,101,102...), 如果是脚本中的i,每次重置为初始的10 -->

3.5 9大隐式对象

无需声明即可使用。

request 代表请求对象(可以获取请求参数,将变量存入request作用域)
response 代表响应对象(返回响应)
out 代表响应的字符输出流
pageContext 页面上下文对象,可以间接获得request等对象,并可以将变量存入page作用域

config jsp的配置信息
page 当前jsp对象(this)
exception 代表的是异常信息(当页面isErrorPage=”true”时有效)

session 变量作用范围是一次会话内有效
application 变量作用范围是整个应用程序有效

page作用域: 变量作用范围仅限于当前页面
request作用域: 变量的作用范围在一次请求内有效,跳转到其他页面依然有效

  5.jsp
   <%
    // 向page作用域存入变量
       pageContext.setAttribute("a", "hello world");
      request.setAttribute("b", "ok");
    %>
      <%
       // 从page作用域获取变量
        Object str = pageContext.getAttribute("a");
       out.print(str);
        %>
  <%
    // 请求转发
    request.getRequestDispatcher("6.jsp").forward(request, response);
%>


     6.jsp
 <%
// 从page作用域获取变量
Object str = pageContext.getAttribute("a");
out.print(str);
Object b = request.getAttribute("b");
out.println(b);
%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值