1.JSP的由来:
在编写Servlet组件时,当涉及到HTML(CCS,JS)代码时我们需要使用大量的out.println() 进行输出,在开发与维护时比较占用开发周期。后来JSP就出现了,用来解决这一问题。2.什么是JSP:
Sun公司制定的一套服务端动态页面技术的规范。也就是使用.jsp文件封装了html,css,js,以及少量的java代码。3.JSP的语法:
(1):JSP里可以写HTML,CSS,JS代码直接写即可里面可以类的属性,定义方法
(3):指令:
可以设置字符集,导包等
常用指令
<%@指令名称 属性=值%>
eg:
<%@page pageEncoding="utf-8"%>
<%@page import="java.util.*"%>
<%@page import="java.util.*,java.sql.*"%>
(4):注释:
<%-- --%>
注释内容会被容器解析出成纯文本
浏览器不会解析出来
此注释会被浏览器解析出来
案例一:通过编写a.jsp代码,在页面中循环输出HelloWorld
代码演示:
<%@page pageEncoding="utf-8" %>
JSP1.0
<%
for(int i=0;i<10;i++){
%>
HelloWorld
<%
}
%>
案例二:通过编写b.jsp代码,在页面实现JAVA表达式
代码演示:
<%@page pageEncoding="utf-8" %>
JSP1.0
<%= (5+6+7+8) %>
<%= Math.sqrt(25) %>
案例三:编写c.jsp在JSP中实现JAVA声明,定义一个参数求和方法
代码演示:
<%@page pageEncoding="utf-8" %>
JSP1.0
<%!
int sum;
public int sum(int a, int b){
sum = a+b;
return sum;
}
%>
<%=sum(6,5) %>
<%=sum %>
案例四:编写data.jsp代码,实现按需要的格式打印日期时间
代码演示:
<%@page pageEncoding="utf-8" %>
<%@page import="java.util.Date" %>
<%@page import="java.text.SimpleDateFormat" %>
当前时间:
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String str=sdf.format(date);
%>
<%= str%>
1.概念
即容器如何创建Servlet对象,如何给Servlet对象分配资源如何调用Servlet对象的方法进行请求处理,如何销毁Servlet对象的过程。
阶段1:实例化(创建Servlet对象)
两个时机:
时机1:容器在接收到请求时,实例化Servlet对象。
时机2:当容器启动时,立即实例化Servlet对象。
需要在web.xml文件中相应的servlet中配置
阶段2:初始化
(1):创建对象后,调用init方法进行初始化。
(2):通常情况下,init方法不需要我们去手动添加,因为GenericServlet抽象类已经提供好了init方 法的实现: 会接受容器创建ServletConfig对象,将对象保存下来,提供了一个方法getServletConfig()获取对象。
如果继承过来的init方法不满足我们的需求时:
比如:我们可以给自定义的一些属性进行赋值操作。
这时,我们可以调用ServletConfig对象的 getInitParameter(String name);
我们可以在web.xml中配置初始化参数的值。
(3):init方法只调用一次。
阶段3:就绪
(1)容器会在收到请求后,调用Servlet对象的service方法进行请求处理。
(2)容器会根据请求方法的不同而调用doGet或者doPost方法
父类中的service中会根据请求方式来决定调用哪一个。
所以,我们有两种选择:
选择1: 覆盖doGet方法或者是doPost方法
选择2:覆盖service方法
阶段4:销毁
(1)容器会根据自己的算法来销毁servlet对象,销毁前 一定会调用destroy()方法 。
(2)此方法也不需要手动提供,GenericServlet已经提供了destroy()方法的实现。 当然,如果你想 自定义一些逻辑时,可以覆盖此方法。
(3)程序卸载时,一定会销毁Servlet对象。
===========================================================
是sun公司开发的用于扩展web服务器的组件规范。
组件:是一个能实现部分功能,需要部署在一定环境下才能运行的模块
容器:可以运行组件的一个程序。
如何开发一个Servlet:
1.编写符合规范的servlet组件
2.引用第三方jar包,编译成.class文件
3.需要打包成以下结构:
appName
--WEB-INF
--web.xml
--classes:存放class文件
--lib:存放第三方jar包
4.将打包的结构部署到tomcat中的webapps文件夹下。
5.启动tomcat
在浏览器上输入http://ip:port/appName/xxx.jsp
错误代码:servlet容器向浏览器返回的状态码
404:访问路径不存在
原因:appName写错,url写错,servlet-name写错
405:方法不被允许使用
原因:service方法名称不一致,方法内的参数类型不符合规范
http协议:
w3c组织(万维网联盟)的一种通信协议,定义了浏览器与web应用之间的数据格式
包含了请求和响应.
请求:是浏览器向服务器发送数据
请求数据包含:
请求行:请求方法+请求路径+协议种类+版本
消息头:都是以键值对的形式存储的
实体内容:只有post请求才会有数据
响应:是服务器向浏览器发送数据
响应数据包含:
状态行:协议种类+版本+状态码+状态信息
消息头:以键值对的形式存储的
响应数据:经过业务逻辑运算后要发送给浏览器的数据
Servlet如何处理http协议
Servlet容器会将接收到的信息进行封装到HttpServletRequest这个类型的一个对象上
我们就可以从request这个对象上获取我们想要的数据
比如:获取版本号,参数,用户提价的数据,字符集等等
Servlet容器在响应浏览器时,也会将一些数据封装到HttpServletResponse类型的一个对象上
发送给浏览器后,浏览器会自动解析
如:绑定消息头,字符集,状态码等等。
注意:每一次请求与响应,Servlet容器都会创建request和response
参数的处理:
请求对象的方法getParameter("");获取浏览器页面的value值,参数要传name属性的值返回字符串类型
请求方式:
get请求方式(默认):提交的数据都会显示在地址栏上,可以提交数据的大小最多为4k。
post请求方式:数据不显示在地址栏上,大小不限制,相对来说安全
处理中文乱码问题:
服务端接收浏览器的数据时:
get请求:
服务端默认使用ISO-8859-1字符集
String username = request.getParameter("");
new String(username.getBytes("ISO-8859-1"),"UTF-8");
此种方法也适合post请求,req.setCharacterEncoding("utf-8");
post请求:
req.setCharacterEncoding("utf-8");
浏览器端接收服务端的数据
使用response对象设置消息头
resp.setContentType("text/html;charset=utf-8");
当一个web组件要完成的功能逻辑,转交给另外一个web组件时此时,我们应该使用转发技术
如:在查询所有员工信息时,servlet组件负责查询所有员工,显示功能交给jsp组件
怎么使用转发:
1.绑定要处理的数据
request.setAttribute(String name,Object obj)
name:绑定名
obj:要绑定的数据
2.获取转发器对象
RequestDispatcher rd = request.getRequestDispatcher(String url);
url:转发目的地的地址
3.转发
rd.forward(request,response)
//获取数据
Object obj = request.getAttribute(String name)
当一个web组件已经完成的功能逻辑,此时,如果需要页面跳转,应该使用重定向
response.sendRedirect("findAll");
案例:模拟一个登陆页面,需要一个jsp页面让用户输入姓名和年龄,然后另外一个页面显示输出
步骤一:编写submit.jsp
代码演示:
<%@page pageEncoding="utf-8" %>
步骤二:修改web.xml文件
代码演示:
login
servlet.LoginServlet
login
/Login
JSPPath02
index.jsp
步骤三:编写servlet组件
1.需要继承HttpServlet父类
2.重写service方法
代码演示:
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("input_name");
int age = Integer.valueOf(request.getParameter("input_age"));
String person = "name:"+name+",age:"+age;
//使用转发技术
request.setAttribute("p", person);
//相对路径
RequestDispatcher rd = request.getRequestDispatcher("person.jsp");
rd.forward(request,response);
System.out.println("-------------------------");
}
}
步骤四:编写person.jsp
代码演示:
<%
Object obj = request.getAttribute("p");
String str = (String)obj;
%>
welcome:<%=str %>