Jsp笔记
目录
Servlet & Jsp
Servlet
- 创建普通的java类并继承HttpServlet
 - 覆写service方法
 - 在service方法中书写逻辑代码即可
 - 在webRoot下的WEB-INF文件夹的web-xml文件中配置servlet
 
<!-- 配置Servlet-->
    <!--配置servlet类路径-->
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>com.hgw.servlet.MyServlet</servlet-class>
    </servlet>
    <!--配置访问方式-->
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/my</url-pattern>
    </servlet-mapping>
url : http://localhost:8080/project/my2
组成:服务器地址:端口号 / 虚拟项目名 / servlet的别名
uri :虚拟项目名 / servlet的别名
Servlet 的生命周期
- 从第一次调用到服务器关闭
 - 如果Servlet在web.xml中配置了load-on-startup, 生命周期为从服务器启动到服务器关闭
- init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进内存是执行
 - destory方法是在servlet被销毁时执行。也就是服务器关闭时。
 
 
Service 方法和 doGet 方法和 doPost 方法的区别
- Service方法:可以处理get方法和post方法
 - doGet方法:处理get方式的请求
 - doPost方法:处理post方式法的请求
 
- 优先调用Service方法处理请求
 - 如果有service 方法中有
super.service(arg0, arg1);,则在调用service方法后调用相应的方法,但是如果没有相应的方法就会报405。因此我们不在覆写的service中调用父类的service,避免405错误。 
Servlet 常见错误总结
- 404 错误:资源未找到
- 在请求地址中的servlet的别名书写错误
 - 虚拟项目名书写错误
 
 - 500 :
- web.xml中校验servlet类的全限路径错误。
 - service方法体中的代码错误。
 
 - 405 错误:请求方式不支持
- 请求方式和servlet 中的方法不匹配所造成的。
 
 
Request 对象
? 服务器每接收一个请求,就会创建一个对象专门的村粗此次的请求数据。
? 服务器接收到浏览器的请求后,会创建一个Request 对象,对象中存储了此次请求相关的请求数据。服务器在调用Servlet时将Request对象作为实参传递给Servlet的方法,比如:service方法。
- request对象
- 作用:request对象中封存了当前请求的所有请求信息
- 注意:request对象有tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
 
 - 使用:
- 获取请求头数据
 - 获取请求行数据
 - 获取用户数据
 
 
 - 作用:request对象中封存了当前请求的所有请求信息
 
// RequestServlet.java
public class RequestServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException{
        // 1. 获取请求头数据
            // 获取请求方式
                String method = req.getMethod();
                System.out.println(method);
            // 获取请求URL
                StringBuffer url = req.getRequestURL();
                System.out.println(url);
                // 获取URI
                String uri = req.getRequestURI();
                System.out.println(uri);
            // 获取协议
                String h = req.getScheme();
                System.out.println(h);
        // 2. 获取请求行数据
            // 获取指定的请求行信息
            String value = req.getHeader("aaa");
    }
}
Response 对象
? 在使用Request 对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢?
? 使用 Request 对象。
? 服务器在调用这定的Servlet 进行请求处理的时候,会给 Servlet 的方法传递两个实参 request 和 response。其中request中封存了请求相关的请求数据,而response 则是用来进行响应的一个对象。
// 设置响应头
    setHeader(String name, String value);   // 在响应头中添加响应信息,但是同键会覆盖。
    addHeader(String name, String value);   // 在响应头中添加响应信息,同键不会覆盖。
// 设置响应状态
    setError(int num, String msg);  // 自定义响应状态码。 
// 设置响应主体
    resp.getWriter().write(String str); // 响应具体的数据给浏览器
// 设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
// 总结:
    service请求处理代码流程:
        设置响应编码格式
        获取请求数据
        处理请求数据
            数据库操作(MVC思想)
        响应处理结果
转发和重定向(写法和区别)
Cookie
Session
ServletContext 对象
ServletConfig 对象
Session( servlet 会话设置)
Jsp
问题:
在学习了Servlet之后,使用Servlet进行页面的展现,代码书写过于麻烦。极大影响了开发效率。
解决:
使用JSP技术
概念:
JSP全名为Java Server Page,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是有Sun Microsystem公司倡导、许多公司参与一起建立的一种动态网页技术标准。
特点:
- 本质上还是Servlet
- 跨平台,一次编写处处运行
 - 组件跨平台
 - 健壮性和安全性
 
 
- 本质上还是Servlet
 访问原理:
浏览器发起请求,请求JSP,请求被Tomcat服务器接收,执行JspServlet将请求的JSP转义成对应的Java文件(也是Servlet),然后执行转义好的Java文件。
Jsp 的语法和指令
JSP 的 page 指令
<%@ page language="java" import="java.util.*,java.lang.*" pageEncoding="utf-8"%> <%@ errorPage = "error.jsp"%>作用:配置jsp文件的转译相关的参数
说明:
language:声明jsp要被转译的语言
import:声明转译的java文件要导入的包,不同的包使用逗号隔开?
pageEncoding:设置jsp文件的数据编码格式?
contentType="text/html; charset=utf-8"不用写,如果有了pageEncoding="utf-8"的话?
extend:设置jsp转译的java文件要继承的父类(包名+类名)?
session:设置转译的servlet中是否开启session支持,默认开启,true表示开启,false表示关闭?
errorPage:设置jsp运行错误跳转对的页面JSP 的 taglib 指令
JSP 的局部代码块
<% int a = 5; %>特点:
? 局部代码块中声明的java代码会被原样转译到jsp对应的servlet文件的_JspService方法中,代码中声明的变量都是局部变量。
缺点:
? 使用局部代码块在jsp中进行逻辑判断,书写麻烦,阅读困哪。
开发:
? servler进行请求逻辑处理,使用jsp进行页面展现。
JSP 的全局代码块
<%! int a = 5; public void test(){ System.out.println("我是全局代码块声明"); } String str = "脚本段输出"; %> <%=str %> // 输出str, 相当于 <% out.writer(str); %>, 注意不要加分号特点:
? 声明的java代码作为全局代码转译到对应的servlet类中。
注意:
? 全局代码块声明的代码,需要使用局部代码块调用。
JSP 的注释
- JSP 中的三种注释
- 前端语言注释
<!-- -->:会被转译,也会被发送,但是不会被执行。 - java 语言注释 
// 和 /* */:会被转译,但是不会被servlet执行。 - Jsp 注释
<%-- --%>:不会被转译。 
 - 前端语言注释
 
- JSP 中的三种注释
 JSP 的静态引入(JSP 的 include 指令)
// 静态引入 <%@include file="要引入的jsp文件的相对路径" %>特点:
? 1. 会将引入的jsp文件和当前jsp文件转成一个java(Servlet)文件使用。
? 2. 在网页中也就显示了合并后的效果。
注意:
1. 静态引入的jsp文件不会单独转译为java(Servlet)文件。- 当前文件和静态引入的jsp文件中不能使用java代码块声明同名变量。
 
JSP 的动态引入
<jsp:include page = "要引入的jsp文件的相对路径"></jsp:include>特点:
? 1. 会将引入的jsp文件单独转译,在当前文件转译好的java文件中调用引入的jsp文件的转译文件。
? 2. 在网页中显示合并的显示效果。
注意:
? 动态引入允许文件中声明同名变量。
优点:
? 降低jsp代码的冗余,便于维护升级。
页面转发(jsp 的转发 forword 标签)
// 可以理解为servlet中的请求转发 <jsp:forward page="要转发的jsp文件的相对路径"></jsp:forward> // 中间不能有空格特点:
1. 一次请求 2. 地址栏信息不变注意:
- 在转发标签的两个标签中间除了写
<jsp:param name = "str" value = "aaa" />子标签不会报错,其他任意字符都会报错。 - name属性为附带的数据的键名
 - value为附带的数据内容
 - 会将数据以?的形式拼接在转发路径的后面
 
- 在转发标签的两个标签中间除了写
 
Jsp 的内置对象
PageContext 对象
- 页面上下文对象,封存了其他内置对象。
 - 注意: 每个jsp文件单独拥有一个pageContext对象。
 - 作用域:当前页面。
 
Request 对象
// 获取请求数据 String s = request.getParameter("str"); request.getAttribute("str");- 封存当前请求数据的对象。
 - 由tomcat服务器创建
 - 一次请求
 
Session 对象
- 此对象用来存储用户的不同请求的共享数据
 - 一次会话
 
Application 对象
- 也就是ServletContext对象,一个项目只有一个。
 - 存储用户共享数据的对象,以及完成其他操作
 - 作用域:项目内
 
Response 对象
// 重定向 <% response.sendRedirect("forward.jsp"); %>- 响应对象,用来响应请求处理结果给浏览器的对象。
 - 设置响应头,重定向。
 
Out 对象
- 响应对象,jsp内部使用。
 - 带有缓冲区的响应对象,效率高于response对象。
 
Page 对象
- 代表当前jsp的对象,相当于java中对this
 
Exception 对象
- 异常对象,存储了当前运行的异常信息。
 
config 对象
- 也就是ServletConfig,主要是用来获取web.xml中的配置数据,完成一些初始化数据的读取。
 
四个作用域对象
pageContext:当前页面。解决了在当前页面内的数据共享问题。获取其他内置对象。
request:一次请求。一次请求的servlet的数据共享。通过请求转发,将数据流转给下一个servelet。
session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求。
application:项目内。不同用户的数据共享问题。将数据从一个用户流转给其他用户。
作用:数据流转
jsp中的资源路径使用
在jsp中的资源路径可以使用相对路径完成跳转,但是:
- 资源的位置不可随意更改。
 - 需要使用
../进行文件夹的跳出,使用比较麻烦。 
使用绝对路径(开发常用):
/虚拟项目名/项目资源路径 ,其中第一个/表示服务器根目录相当于:localhost:8080? 例如:
?
<a href = "/jsp/jspPro.jsp">jspPro.jsp</a>?
<a href = "/jsp/a/a.jsp">a.jsp</a>使用jsp中自带的全局路径声明:
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.get %> <base href = "<%=basePath%>"> // 作用:给资源前面添加项目路径: http://127.0.0.1:8080/虚拟项目名/
原文:https://www.cnblogs.com/hgwq/p/12061356.html