查询为例:开发流程
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>
1. 如何接收各种不同表单参数
<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);
}
}
2. jstl 标签
c:choose 类似于 if elseif else
语法:
<c:choose>
<c:when test="条件1">内容1</c:when>
<c:when test="条件2">内容2</c:when>
...
<c:when test="条件n">内容n</c:when>
<c:otherwise>以上条件都不成立时</c:otherwise>
</c:choose>
c:out 用来输出特殊内容
它可以对${}输出的内容进行控制,可以控制是否忽略html代码
<c:out escapeXML="false" value="${作用域变量}"> 不忽略html
<c:out escapeXML="true" value="${作用域变量}"> 忽略html,(当做普通文本)
fmt:formatDate 用来格式化日期
fmt:formatNumber 用来格式化数字
语法示例:
<fmt:formatDate value="日期对象" pattern="日期格式"/>
<fmt:formatNumber value="数字对象" pattern="数字格式"/>
数字格式 #
和 0
其中0可以用来前置补零或后置补零
3. jsp 遗留语法
3.1 jsp的脚本
<%
任意java代码
%>
jsp的弊端在于当代码越来越多时,使用jsp脚本的方式,会造成项目代码难以维护
现在绝大多数公司都禁止在jsp出现脚本代码
3.2 jsp表达式
<%= 表达式 %>
作用是向页面显示值, 表达式不能以;
结束
3.3 jsp指令(**)
<%@ page contentType="页面的内容类型和编码"
import="要导入的java类"
isELIgnored="是否忽略EL表达式的处理"
errorPage="出现错误时,要跳转的页面"
isErrorPage="用在错误页面上,取值为true表示是错误页面,这时候才能在页面中使用exception变量"
%>
exception只能配合jsp表达式和jsp脚本使用
<%@ taglib prefix="前缀" uri="标签的唯一标识" %>
作用是导入标签库
<%@ 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++);
}
}
- 当首次访问此jsp时,tomcat会把jsp转译为*.java的类(间接继承自HttpServlet)
- 再把*.java类编译为*.class字节码
- 把加载到虚拟机执行,生命周期类似于servlet的生命周期
jsp的本质仍是一个servlet
3.5 9大隐式对象
无需声明即可使用。
request 代表请求对象(可以获取请求参数,将变量存入request作用域)
response 代表响应对象(返回响应)
out 代表响应的字符输出流
pageContext 页面上下文对象,可以间接获得request等对象,并可以将变量存入page作用域
config jsp的配置信息
page 当前jsp对象(this)
exception 代表的是异常信息(当页面isErrorPage="true"时有效)
session 变量作用范围是一次会话内有效
application 变量作用范围是整个应用程序有效
page作用域: 变量作用范围仅限于当前页面
request作用域: 变量的作用范围在一次请求内有效
5.jsp forward 6.jsp 两个页面使用的是同一个请求
servlet
servlet forward x.jsp servlet与jsp使用的是同一个请求