目录
一 servlet 的部署,创建和运行
1 Servlet 类:
写一个servlet就是编写“javax.servlet.http.HttpServlet”的子类,HttpServlet实现了Servlet接口
2 字节码文件的保存
将源文件保存在服务目录(ch6)\WEB-INF\classes\moon\sun中,在classes目录用
javac -cp servlet-api.jar moon\sun\java文件名.java
注意:将去Tomcat安装目录lib子目录中的servlet-api.jar文件复制到\ch6\WEB-INF\classes中,否则cp参数必须显示给出servlet-api.jar位置。如j
avac -cp D:\tomcat\lib\servlet-api.jar moon\sun\java文件名.java
3编写部署文件web.xml
在 ch6\WEB-INF中编写web.xml文件,内容如下:
<?xml version = “1.0” encoding = "utf-8”? > <web-app> <servlet> <servlet-name>hello</servlet-name> <%--系统标记servlet文件的名字 --%> <servlet-class>moon.sun.Example6_1</servlet-class> <%-- servlet文件的位置 --%> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <%-- 系统标记servlet文件的名字 --%> <url-pattern>/lookHello</url-pattern> <%-- servlet文件对应的“在浏览器输入的名字” --%> </servlet-mapping> <web-app>
4运行Servlet
http://127.0.0.1:8080/ch6/lookHello
5向Servlet传值
在请求一个servlet时,可以在url-pattern中额外加入参数及其值,格式为:
url-pattern?参数1=值&参数2=值...参数n=值
相应的,servlet也可以获取参数对应的值,格式为:
request.getParameter(参数n);
二Servlet的工作原理
一个Servlet对象的生命周期由三部分构成
初始化servlet
servlet调用service方法响应用户的请求
自动调用destroy销毁servlet
三 通过jsp页面调用servlet
1通过form表单向servlet提交数据
form形式:
<form action="url-pattern"> <--详情见前面的web.xml--> </form>
url-pattern形式
url-pattern?参数1=值&参数2=值...参数n=值
2 通过超链接访问servlet
可以用<a herf="url-pattern"> </a>访问servlet
接下来,用一个例子来帮助读者来理解上述内容
3 example.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<HTML><body bgcolor=#ffccff>
<form action="computeBill?discount=6" id= textStyle method=post>
输入账单:<br>
<textArea name='billMess' id =textStyle rows=5 cols=30 >
剁椒鱼头:62.9元,烤鸭:199元,红焖大虾:289.9元。
</textArea>
<br><input type=submit id=textStyle value="提交">
</form>
</body></HTML>
4 example_Servlet.java
package moon.sun;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Example6_3_Servlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response)
throws IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println("<html><body bgcolor=yellow>");
String discountMess=request.getParameter("discount");
double discount = Double.parseDouble(discountMess);
String billMess=request.getParameter("billMess");
if(billMess == null) {
out.print("没有账单");
return;
}
double bill = getPriceSum(billMess); //账单金额。
double billDiscount = bill*(discount/10); //优惠后的金额。
out.print("<h2>"+billMess+"<br>消费:"+bill+"圆");
out.print("优惠"+discount+"折<br>后的金额:"+billDiscount+"圆");
out.print("</h2></body></html>");
}
public double getPriceSum(String input){ // 定义方法
Pattern pattern; //模式对象
Matcher matcher; //匹配对象
String regex="-?[0-9][0-9]*[.]?[0-9]*" ;//匹配数字的正则表达式
pattern = Pattern.compile(regex); //初试化模式对象
matcher = pattern.matcher(input); //初始化匹配对象,用于检索input
double sum = 0;
while(matcher.find()) {
String str = matcher.group();
sum += Double.parseDouble(str);
}
return sum;
}
}
5 web.xml
<web-app>
<servlet-name>computeBill</servlet-name>
<servlet-class>moon.sun.Example6_3_Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>computeBill</servlet-name>
<url-pattern>/computeBill</url-pattern>
</servlet-mapping>
</web-app>
四 共享变量
在servlet声明的成员变量可以被所有访问这个servlet的用户共享
用户对servlet属性的修改会影响其他用户
五 重定向和转发
重定向的功能是用户从当前页面或servlet重定向到另一个jsp页面或servlet,因此,重定向的目标页面或servlet无法用request获取用户提交的数据
转发的功能是用户对当前页面或servlet的请求转发给另一个jsp页面或servlet
1重定向(sendredirect())
2转发(forward())
1得到RequestDispatcher对象,通过servlet调getRequestDispatche
r(string path),path是一个isp页面的url或servlet的url-pattern
2转发。在步骤1中得到的RequestDispatcher对象调用forward( ServletRequest request,ServletResponse response)转发到jsp页面或servlet
3 区别
用户可以看到转发到的页面或servlet运行效果,到时看不到“转发到的页面或servlet运行效果”的url