一.Servlet3.0
Servlet3.0支持异步,支持注解,支持插件.
1.注解开发
需求: 访问一个Servlet,在后台输出一句,Servlet的注解; 响应一句 你好!
代码实现:
@WebServlet(urlPatterns = "/Demo1_Servlet3" )
public class Demo1_Servlet3 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
System.out.println("已 经接受到了请求");
resp.getWriter().print("你好!");
}
}
2.@WebServlet注解
name() 代表的是servlet的名字
String[] urlPatterns() default {}; 请求的资源路径
String[] value() default {}; 他的作用和urlPatterns作用一样
一般使用value不使用urlPatterns ; 如果有value 属性名称可以不写
举例:@WebServlet(urlPatterns = "/Demo1_Servlet3" )
@WebServlet("/Demo1_Servlet3" )
int loadOnStartup() default -1; 启动时机
二.Reuqest域对象_请求转发_重定向
1.Request作为域对象
setAttribute(String name, Object obj) void 向Request域中保存数据
getAttribute(String name)Object 从Request域中获取数据
removeAttribute(String name) void 从Request域中移除数据
域对象: 作为一个容器对象,不同的域对象他们的使用范围不同.
ServletContext 整个web项目中都有效
session 整个会话中都有效
request 一次请求中有效
2.请求转发
使用request对象调用一个调度器对象Dispatcher , 还调用一个forward(request,response)进行转发.
整个过程只有一次请求.
2.1转发案例: request域中设置内容转发后再新的Servlet获取request域对象中的值
/**
* 1.如何转发,API
1) RequestDispatcher getRequestDispatcher(String path) 调用一个调度器对象,传递的是将要跳转的地址;
2) RequestDispatcher对象有一个forward(req,resp) 可以完成转发
举例:
RequestDispatcher dispatcher = req.getRequestDispatcher("Servlet02");
dispatcher.forward(req,resp);
//把两句合并成一句:
req.getRequestDispatcher("Servlet02").forward(req,resp);
* 2.获取request域对象,给里面存放一个name为tom值
* request.setAttribute("name","tom")
* 3.让页面转发哦到Demo2_ForwardServlet
* 4.在Demo2_ForwardServlet, name取出来打印在控制台.
*/
@WebServlet("/Demo_ForwardServlet")
public class Demo_ForwardServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("已经访问到了Demo_ForwardServlet,设置名字即将转发");
//2.给request域对象设置内容
request.setAttribute("name","tom");
//3.转发到Demo2_ForwardServlet
request.getRequestDispatcher("Demo2_ForwardServlet").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/Demo2_ForwardServlet")
public class Demo2_ForwardServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//2.获取request域中的数据
String name = (String) request.getAttribute("name");
System.out.println("这是Demo2_ForwardServlet获取到的name = "+name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
重定向的案例: request域中设置内容重定向后再新的Servlet获取request域对象中的值
@WebServlet("/Demo_Redirect")
public class Demo_Redirect extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("已经访问到了Demo_Redirect,设置名字即将转发");
//2.给request域对象设置内容
request.setAttribute("name","tom");
//3.重定向到Demo2_Redirect
response.sendRedirect(this.getServletContext().getContextPath()+"/Demo2_Redirect");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/Demo2_Redirect")
public class Demo2_Redirect extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//2.获取request域中的数据
String name = (String) request.getAttribute("name");
System.out.println("这是Demo2_Redirect获取到的name = "+name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.服务器内部页面跳转(转发/重定向)
区别:
1.转发浏览器地址栏不变; 重定向浏览器地址栏改变;
2.转发只有一次请求,一次响应; 重定向两次请求两次响应;
3.转发只能转发到本项目内部,不能转发到外网; 重定向可以转发到外网;
4.转发可以在request域中存数据,也可以获取到; 重定向的话,数据不能存在request域中
5.转发使用request对象; 重定向使用的response对象
6.转发的时候request.getRequestDispatcher("资源路径"),可以不加虚拟路径, 重定向resp.sendRedirect("虚拟路径/资源路径")
三.JSP
1.概念
JSP全名是Java Server Pages,
它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在.
JSP的本质是一个Servlet!!
2.入门案例
web目录下新建一个demo1.jsp; 编写一个HTML代码;java代码
我的jsp的html代码
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
System.out.println(dateStr);
%>
3.jsp注释
html注释
注释html代码; 源码中显示被注释的内容
java注释 // /**/ 只能用在java代码中
只能注释java代码
jsp注释 <%--被注释的内容--%>
即可注释html代码也可以注释java内容 (不会再源码中显示,也不会再编译后的文件显示)
4.jsp中的脚本类型(三种)
第一种: 编写下面的代码,会内容生成在一个成员方法中
<%
java代码
%>
第二种:编写下面的代码,内容会生成在成员位置(类中方法外,定义成员变量)
<%!
java代码
%>
第三种方式: 相当于一个输出语句,向浏览器输出
<%=表达式%>
代码举例:
<%!
int i = 20;
%>
<%=i%>
5.jsp的执行原理
1.jsp本质是一个Servlet
2. demo2.jsp 请求的时候会被编译成demo2_jsp.java==> 被编译成.class ====>虚拟机加载.class文件执行
3.内部执行的原理:
demo2_jsp.java=== Demo2_jsp 类 继承HttpJspBase , 重写了_jspService方法 ===> HttpJspBase
继承HttpServlet,重写了service; service方法中调用了_jspService (执行的是子类的方法)
6.jsp的9大内置对象(面试题)
内置对象: 在jsp中<% %> 可以直接使用的对象
对象 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
session HttpSession
application ServletContext
out JspWriter
page Object
pageContext PageContext
exception Throwable (有一个开关,设置为错误页面才有该对象)
四.EL表达式
1.概念
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,
减少jsp脚本的编写,EL 出现的目的是要替代jsp页面中输出脚本的编写。
<%=date%>
2.作用
1. 从域对象中查找指定的数据
(ServletContext[jsp:application] Session HttpServletRequest pageContext[jsp有servlet中没有])
域对象:setAttribute(String key, Object value) ....
2. 内置对象使用
3. 执行运算符
4. 动态获取配置文件中的数据(框架在说)
3.EL表达式的使用
3.1格式
setAttribute(String key, Object value)
${key} 根据key值获取value
3.2 EL表达式作用一:从域中取出基本数据数据
需求:给域中存放String数据,通过EL表达式获取到.
代码演示: