文章目录
javaWeb
一、课程目标
【掌握】servlet注解开发
【理解】jsp原理
【了解】jsp标签指令
【掌握】jsp脚本书写
二、servlet注解开发
servlet的jar包是由tomcat进行提供,用于处理客户端发送至服务器的请求,随着技术的不断发展进行版本的更新,现一般使用的版本为3.0之前版本与3.0之后的版本,功能是一样的,只不过对配置与书写上进行了更新,但是实际使用时根据不同的需求进行选择,本质执行原理是一样的
servlet3.0为了简化配置 提供了相应的注解开发的功能
语法:
书写在类声明之上。标注当前类为servlet指定servlet的name与url
@WebServlet(name="my",urlPatterns={"/my","/my1"})
等价于配置文件中的
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>class地址</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/my1</url-pattern>
</servlet-mapping>
name可以省略默认会使用当前类名当做name
urlPatterns是数组形式的地址,可以书写多个地址执行同一个servlet
简写
当只进行url配置且,url只有一个时可以简化注解的书写
@WebServlet("/my")
注意:注解形式虽然简化了配置,但使得项目进行维护时更加繁琐,所以在实际开发过程中根据实际需求进行书写。本质注解开发与配置开发是一样的,只不过在加载时发现相应注解后会执行相应的配置
三、jsp
在使用servlet返回页面过程中,虽然可以返回动态页面,但是如果页面拥有各种样式与功能,那么servlet中的代码就会很多,而且会出现在java中书写html字符串的形式,对于后台开发很不友好,所以,开发出了jsp(java server page)java书写的服务页面用于解决这个问题.
jsp的执行流程
客户端请求jsp,在第一次请求时,服务器会将jsp解析为servlet,创建servlet进行处理,再次请求时如果jsp已经被解析且没有被修改,则直接返回之前解析的servlet进行处理,否则重写解析
3.1 创建jsp页面
开发工具一般都提供jsp页面的创建
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 相当于在servlet页面书写 contentType=text/html; charset=UTF-8 -->
<title>Insert title here</title>
</head>
<body>
<!-- 默认编码为ISO-8859-1 需要将页面编码修改为UTF-8 -->
</body>
</html>
jsp通过特殊的语法,将servlet变为了可以直接书写html代码的文件,只需要在首行标识这本质是一个servlet页面即可,之后可以完全按照html页面书写的语法进行书写,在执行过程中会自动创建输出流对象将html代码输出至页面
可以让前台将静态页面书写完毕后通过添加<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>指令的形式使其变为可执行的java代码并书写相应的java命令
3.2 page指令
书写在jsp首行用于jsp页面设置的指令,拥有很多的属性
语法:
<%@ page 属性1="属性值" 属性2="属性值1,属性值2"… 属性n="属性值n"%>
属性 | 描述 | 默认值 |
---|---|---|
language | 指定JSP页面使用的脚本语言 | java |
import | 通过该属性来引用脚本语言中使用到的类文件 | 无 |
contentType | 用来指定JSP页面所采用的编码方式 | text/html,UTF-8 |
在jsp中拥有大量的指令操作通过设置完成不同的功能
3.3 脚本
由于jsp是通特殊语法可以直接书写html代码并通过out对象输出到客户端,但是本质是java代码,为了与直接输出到客户端的html代码区分,所以需要使用脚本块将书写在jsp页面的java代码进行包裹,这样在将html页面输出到客户端的过程中,就不会讲java代码当做html代码进行输出
语法:
<% java代码 %>
<!-- html注释 -->
<%-- jsp注释 脚本:书写在jsp中进行java逻辑的执行 --%>
<%-- jsp注释 就是在java中书写的注释 由于html中的注释会发送至客户端 所以jsp中不会发生至客户端 --%>
<% int a=1;int b=2; %>
<% System.out.print(a+b); %>
<% response.getWriter().print(a+b); %>
<% out.print(a+b); %>
<%-- 可以直接将书写的内容输出到页面 --%>
<%="可以直接将书写的内容输出到页面"%>
<%=(a+b)%>
虽然jsp本质是servlet可以直接书写java代码进行逻辑操作,但是页面出现大量的java代码会影响书写,所以一般在进行书写时都会将逻辑操作交由servlet进行处理
3.4 方法声明
语法:
由于jsp可以理解为servlet中的某一个请求,所以不能直接进行方法的声明,需要通过特殊的声明语法
<%!
//代表声明一个方法
//一般会将这样语法书写在servlet中 jsp只负责数据的展示
public int add(int a,int b){
return a+b;
}
%>
<%=add(1,2) %>
3.5 其他指令
3.5.1 编译指令
指的是书写在jsp页面中不会进行直接显示与功能的指令,在jsp被请求编译时进行使用的指令
语法格式:
<%@deriective attr1=val1 attr2=val2...... %>
<%@ 指令 属性名="值" 属性名="值" 属性名="值"%>
page指令
主要设置jsp相关属性,如:页面编码、缓存大小、错误处理页面等,page指令中除了import属性之外,其他属性只能出现一次;
<%@ page language="java" contentType="text/html,ISO-8859-1" import="java.util.*,java.sql.*,java.io.*"
session="true|flase" buffer="none|8kb|sizekb" autoFlush="true|false" info="一段字符串内容"
pageEncoding="ISO-8859-1"%>
1、language 指定JSP页面使用的脚本语言,默认值为java
2、contentType 用来指定JSP页面的文件类型和所采用的编码方式,建议修改为“text/html,UTF-8”
3、import 通过该属性来引用脚本语言中使用到的类文件,导入多个类或包用逗号分隔。
JSP引擎自动导入java.lang.*;java.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*
4、pageEncoding 指定JSP页面的编码方式, 默认值为“ISO-8859-1”,建议修改为UTF-8
5、session,用来说明是否创建session对象,默认为true ,页面中可以不写
6、buffer,用来指定out对象是否创建buffer缓冲区,并指定缓冲区大小。默认为8kb,none表示不创建缓冲区。--也可以不写
7、autoFlush,缓冲区是否自动刷新,默认为true,如果为false,缓冲区满后不手动刷新会报异常。--不写
8、info,定义一个字符串常量,servlet使用getServletInfo方法可以打印。(如作者、版本、版权)
9、errorPage,指定异常处理页。也可以在web.xml中使用<error-page>元素为整个WEB应用程序设置处理页面,
其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以"/"开头的错误处理页面的路径。
如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中这是的错误处理将不对该页面起作用。
include指令
在jsp开发当中,为了避免代码冗余(重复),可以把jsp开发当中多次使用的功能代码封装成一个独立的jsp文件。
include指令:用于引入其他JSP页面,如果使用include指令引入了其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个Servlet,所以include指令引入通常也成为静态引入。
<%@include file=“被包含组件的绝对URL或相对URL"%>
被引入的文件必须遵循JSP语法。被引入的文件可以是任意扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。由于使用include指明将会涉及到2个JSP页面,并会把JSO翻译成一个Servlet,所以这两个JSP页面的指令不能冲突(pageEncoding和导包除外)
就是在jsp编译之前将指定的jsp页面加载到当前页面中,相当于将指定jsp页面代码复制到指定位置
taglib指令
通过使用taglib指令,开发者可以导入其他的标签库,来完成特定的功能。
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
虽然后期jsp仅仅用于数据的展示,但是仍然会书写java代码,所以提供了第三方标签库,通过taglib指令可以在jsp页面中引入标签库,通过特定的标签实现原本java的代码(在jsp页面通过这些标签完成不写任何java代码)
3.5.2 动作指令
指的是在jsp编译为servlet后执行过程中提供功能的指令(可以理解为将java的代码进行了指令的封装,减少页面中java代码出现的频率)
语法格式:
<%jsp:deriective attr1=val1 attr2=val2...... %>
<%jsp:指令 属性名="值" 属性名="值" 属性名="值"%>
param指令
用于传递参数,必须与其他支持参数指令的标签一起使用。
<jsp:forward page="index.jsp">----传到index.jsp页面
<jsp:param name="name" value="心雨"/>
<jsp:param name="password" value="123"/>
</jsp:forward>
forwoad指令
执行页面跳转,将请求的处理转发到下一个页面。可以使用参数指令进行数据的传输
<jsp:forward page=“date.jsp” />
a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
a.jsp<br>
<jsp:forward page="b.jsp">
<jsp:param value="admin" name="username"/>
<jsp:param value="123456" name="password"/>
</jsp:forward>
</body>
</html>
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
b.jsp<br>
<input type="text" value="<%=request.getParameter("username") %>">
<input type="text" value="<%=request.getParameter("password") %>">
</body>
</html>
指令就是通过标签实现原本java代码书写的功能
<%
request.setAttribute("username","admin");
request.setAttribute("password","123456");
request.getRequestDispatcher("b.jsp").forward(request, response); %>
<input type="text" value="<%=request.getAttribute("username") %>">
<input type="text" value="<%=request.getAttribute("password") %>">
useBean指令
用于调用指定类无参构造方法创建对象
<jsp:useBean id="s1" class="javabean.Student" scope="page" />
<%-- 等价于 Student s1 =new Student()
id就是创建对象的变量
class就是创建对象的类
scope是创建对象作用域
--%>
<%=s1 %>
setProperty指令
用于设置指定对象指定属性的值
<jsp:useBean id="s1" class="javabean.Student" scope="page" />
<jsp:setProperty name="s1" property="name" value="张三"/>
<jsp:setProperty name="s1" property="age" value="18"/>
<%-- 等价于s1.setName("张三")
注意一定要书写set方法的属性才能进行使用
name就是进行赋值的对象
property就是赋值的属性
value就是对应的值
--%>
<%=s1 %>
getProperty指令
用于获取指定对象指定属性的值
<jsp:useBean id="s1" class="javabean.Student" scope="page" />
<jsp:getProperty name="s1" property="name"/>
<jsp:getProperty name="s1" property="age"/>
<%-- 等价于<%= s1.getName() %>
name就是进行取值的对象
property就是获取那个属性的值
--%>
include指令
<jsp:include page="index.jsp"/>
<%--将指定页面导入当前页面--%>
include编译指令与include动作指令的区别
<div>
<%@ include file="index.jsp" %>
</div>
<div>
<jsp:include page="index.jsp"/>
</div>
3.6 jsp执行流程
当客户端请求指定jsp时,首先在已经翻译好的文件中查找,是否修改,如果已存在并且没有修改则直接进行操作,如果不存在或进行了修改,那么现将jsp翻译为servlet,之后编译servlet初始化创建servlet对象,将请求交由servlet对象进行处理.
翻译阶段:当服务器中没有对应servlet实例或对jsp进行修改时,进入翻译阶段,将jsp翻译成对应的setvlet
编译阶段:将对应的serlvet.java编译为对应的.class执行文件
执行阶段:调用对应servlet初始化方法创建对应的servlet实例对象并保存至服务器中,并通过配置获取注解的形式将实例与url请求进行关联.再次请求时直接使用对应的实例进行服务的处理
3.7 jsp组成
静态内容:
指的是在jsp中书写的html相关的静态页面数据(包含html、css、js以及前端相应的代码)
注释:
<%- 注释内容 -%>
书写在jsp中在编译时不会进行编译的内容
小脚本 :
<% java代码 %>
直接在jsp中书写的java代码,在编译成servlet进行执行的代码
声明:
<%! 声明方法 %>
用于在jsp中声明方法(属于声明脚本)
表达式:
<%= 拥有返回值的表达式 %>
将表达式的结果直接输出到页面上等价于out.print(表达式)(属于表达式脚本)
指令:
编译指令<%@指令 属性=值%>
page/include/taglib
动作指令<jsp:指令 属性=值/.>
forward/param/include/useBean/setProperty/getProperty
模仿html标签样式,用于减少在jsp页面书写大量的java代码