Servelet
创建servlet的类、怎样在Tomcat服务器上保存编译这个类所得到的字节码、怎样编写部署文件、怎样请求Tomcat服务器创建一个servlet。
写一个创建servlet的类就是编写一个特殊类的子类,这个特殊的类就是javax.servlet.http包中的HttpServlet类。这样的子类创建的对象习惯地被称作一个servlet。
字节码文件的保存
为了调试代码的方便,可以事先将创建servlet的类的源文件,按着其包名,保存到Web服务目录的下述子目录中:\WEB-INF\classes\myservlet\control
然后按如下格式编译源文件(如图5.1):
classes>javac myservlet\control\Servlet源文件
例如:
classes>javac myservlet\control\Example5_1_Servlet.java
部署文件web.xml:
编写的web.xml文件需要保存到Web服务目录的WEB-INF子目录中,比如ch5\WEB-INF中。根据给出的Servlet类,web.xml文件的内容如下):
<?xml version="1.0" encoding="iso-8859-1"?>
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>myservlet.control.Example5_1_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/lookHello</url-pattern>
</servlet-mapping>
</web-app>
1. <servlet>标记及子标记
<servlet>标记需要有2个子标记:
<servlet-name>和<servlet-class>
其中<servlet-name>标记的内容是创建的servlet的名字.
<servlet-class>标记的内容指定用哪个Servlet类来创建servlet。
2. <servlet-mapping>标记及子标记
一个<servlet>标记会对应地出现一个<servlet-mapping>标记,<servlet-mapping>标记需要有两个子标记:
<servet-name>和<url-pattern>.
其中<servet-name>标记的是创建的servlet的名字,< url-pattern >标记用来指定用户用怎样的URL格式来请求servlet,比如,<url-pattern >标记的内容是:/lookHello,
那么用户必须在浏览器的地址栏中键入:
http://127.0.0.1:8080/ch5/lookHello
来请求名字是hello的servlet。
3.0版本D web Project
Build\class->webinfo
包中新建servelet
URL mapping映射
生命周期方法
Init service destroy
网址后加@WebServlet的地址
Alt+/提示
Jsp在<%中写java
Servelet在service中out.print HTML
向servelet传递参数的值
在请求一个servlet时,可以在请求的url-pattern中额外的加入参数及其值,格式是:
servlet名?参数1=值1&参数2=值…参数n=值
那么被请求的servlet就可以使用request对象获取参数的值,例如:
request.getParameter(参数n)
比如可以在浏览器的浏览器键入:
http://127.0.0.1:8080/ch5/lookHello?moon=loveliness
创建servelet文件时新建可选(不是选class),才会自动配置web.xml
JSP文件在深一层目录的话要改url映射: <url-pattern>/ch5/computeBill</url-pattern>
Servlet:配置方法注解、web.xml
正则表达式:‘+’表示至少出现一次。* 就是单个字符匹配任意次,即贪婪匹配。 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配
servlet的工作原理
一个请求一个线程
Servelet是单例
servlet的生命周期主要有下列三个过程
- init方法完成必要的初始化工作。
- 诞生的servlet再调用service方法响应用户的请求。
- 当服务器关闭时,调用destroy方法,消灭servlet
Jsp页面访问servlet:
web.xml文件中<servlet-mapping>标记的子标记<url-pattern>指定的请求servlet的格式是“/lookHello”,那么JSP页面请求servlet时,必须要写成 “lookHello”,不可以写成“/lookHello”,否则将变成请求root服务目录下的某个servlet。
通过表单向servlet提交数据
<url-pattern>指定的请求servlet的格式是"/computeBill",那么
<form action= "computeBill " … …>
</form>
当请求一个servlet时,可以加入参数及其值,格式是:
<form action= "computeBill?sideA=10.66&sideB=23.9&sideC=897 " … …>
</form>
通过超链接访问servlet
如果web.xml文件中<url-pattern>指定的请求servlet的格式是"/triangle",
href的值是" triangle ",如下所示意:
<a href="triangle"></a>
共享变量
Servlet类所创建的servlet的,用户将共享该servlet的成员变量
doGet和doPost方法
重定向与转发
区别:转发后的页面可以保留原request的内容
页面地址栏无变化
重定向:void sendRedirect(String location)
实现转发的步骤如下:
1.得到RequestDispatcher对象
RequestDispatcher dispatcher=
request.getRequestDispatcher("a.jsp");
2.转发
例如: dispatcher.forward (request,response);
将用户对当前JSP页面或servlet的请求转变成对a.jsp页面的请求。
使用session
HttpSession session=request.getSession(true);
实验
运行a.jsp页面如图:
如果输入内容不为空,比如输入“中国”,提交给Servlet,Servlet将用户请求再转发到b.jsp页面,在该页面显示输入的内容。
代码:
//Servlet.java
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
String number=request.getParameter("name");
try{
// double n=Double.parseDouble(number);
RequestDispatcher dispatcher=
request.getRequestDispatcher("b.jsp");
dispatcher.forward(request, response);//转发
}
catch(NumberFormatException e){
response.sendRedirect("a.jsp"); //重定向
}
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
}
<!-- a.jsp -->
<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=cyan><font size=2>
<form action="twoPath" method=post>
输入名字: <input type=text name="name">
<br><input type=submit value="提交">
</form></body></HTML>
<!-- b.jsp -->
<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=pink><font size=2>
<%
String s= request.getParameter("name");
byte [] bb= s.getBytes("iso-8859-1");
s = new String(bb,"gb2312");
%>
<b><br>用户输入的是<%= s%>
</body></HTML>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>t5</display-name>
<servlet>
<servlet-name>twoPath</servlet-name>
<servlet-class>servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>twoPath</servlet-name>
<url-pattern>/twoPath</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>