目录
<!-- 配置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的别名
super.service(arg0, arg1);,则在调用service方法后调用相应的方法,但是如果没有相应的方法就会报405。因此我们不在覆写的service中调用父类的service,避免405错误。? 服务器每接收一个请求,就会创建一个对象专门的村粗此次的请求数据。
? 服务器接收到浏览器的请求后,会创建一个Request 对象,对象中存储了此次请求相关的请求数据。服务器在调用Servlet时将Request对象作为实参传递给Servlet的方法,比如:service方法。
// 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");
}
}
? 在使用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思想)
响应处理结果
问题:
在学习了Servlet之后,使用Servlet进行页面的展现,代码书写过于麻烦。极大影响了开发效率。
解决:
使用JSP技术
概念:
JSP全名为Java Server Page,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是有Sun Microsystem公司倡导、许多公司参与一起建立的一种动态网页技术标准。
特点:
访问原理:
浏览器发起请求,请求JSP,请求被Tomcat服务器接收,执行JspServlet将请求的JSP转义成对应的Java文件(也是Servlet),然后执行转义好的Java文件。
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 的注释
<!-- -->:会被转译,也会被发送,但是不会被执行。// 和 /* */:会被转译,但是不会被servlet执行。<%-- --%>:不会被转译。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为附带的数据内容
- 会将数据以?的形式拼接在转发路径的后面
PageContext 对象
Request 对象
// 获取请求数据
String s = request.getParameter("str");
request.getAttribute("str");
Session 对象
Application 对象
Response 对象
// 重定向
<%
response.sendRedirect("forward.jsp");
%>
Out 对象
Page 对象
Exception 对象
config 对象
pageContext:当前页面。解决了在当前页面内的数据共享问题。获取其他内置对象。
request:一次请求。一次请求的servlet的数据共享。通过请求转发,将数据流转给下一个servelet。
session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求。
application:项目内。不同用户的数据共享问题。将数据从一个用户流转给其他用户。
作用:数据流转
在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