Servlet入门笔记和代码
第一个Servlet
首先先创建一个Web项目,然后创建一个名叫LoginServlet.java类,必须创建包,这是抒写规范。
LonginServlet.java中注解:
如果一个类继承了HttpServlet,这类就是Servlet类 HttpServlet类中有大量的方法
右键——Source——Override/Implement Methods——选择doGet()和doPost()方法,doGet()负责处理得到请求,doPost()负责
需要为LoginServlet配置虚拟路径,需要在web.xml中配置虚拟路径
因为数据的呈现需要用到页面,而Servlet类比较适合做业务逻辑,所以要创建一个jsp页面
package cc.java.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是doGet()"); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是doPost()"); } }
在WebContent—WEB-INF目录下有一个web.xml文件,通过这个xml来设置LoginServlet的虚拟路径
给LoginServlet类配置一个对外访问的路径 通过标签来配置
1.使用<servlet>标签 一个<servlet>标签就代表一个类 <servlet>中有两个标签<servlet-name>和<servlet-class>
其中<servlet-class>是描述当前类的具体路径,也就是LoginServlet.java 路径写法就是”所在的包名+类名”,
2.<servlet-name>中的名称尽量和类名保持一致 配置好别名之后,正式开始配置访问路径 <servlet-mapping>中有两个标签<servlet-name>和<url-patten>
<servlet-name>中的值和<servlet>中的<servlet-name>值保持一致 接下来配置一个对外的访问路径 /LoginServlet /代表的就是我们的服务器地址,目前是Tomcat和我们的工程名
<?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" 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>zhumeng-servlet1</display-name> <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> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>cn.java.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app>
设置好xml中的内容后,我们可以先测试一下,运行LoginServlet.java,此时控制台会输出”我是doGet()”方法,这也是默认使用的方法
如果要实现输出”我是Post()”方法我们就需要创建一个jsp页面
<form>中action的值为”http://localhost:8080/zhumeng-servlet/LoginServlet”,这里method=”post”,请求方式为post
接下来运行jsp程序,点击登录就会显示”我是Post()”方法
目前的action中值是固定,我们要实现动态地址 在上面的定义处 String path = “”;
request.getScheme()该方法是返回协议,也就是http
request.getServerName()该方法返回的是字符串,也就是IP地址
request.gerServerPort()该方法是获得端口
request.getServletContext().getContextPath()动态获取工程名
前面可以不加”/” 因为getContextPath()返回值有”/” 通过脚本符号来写入到action 中
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getScheme()+":"+"//"+request.getServerName()+":"+ request.getServerPort()+request.getServletContext().getContextPath()+"/"; %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <div align="center"> <form action="<%=path%> >/LoginServlet" method="post"> <p> 用户名: <input type="text" name="username"> </p> <p> 密 码 <input type="password" name="password"> </p> <p> <input type="submit" value="登录"><input type="reset" value="重置"> </p> </form> </div> </body> </html>
Servlet的生命周期
- 初始化阶段调用init()方法
- 响应客户请求阶段调用service()方法
- 终止阶段调用destroy()方法
init():Servlet第一次被访问的时候调用
service():每次请求都会被调用
destory():当Servlet被销毁的时候调用
可以通过更快捷的方式来创建service类,右键包名—new—Servlet就可以实现快捷创建Servlet类
生成的servlet按照下面的方法来抒写,不需要的注释就删掉
自动生成的servlet类中有注解:@WebServlet(“/LifeServlet”),这句话等于xml写的虚拟路径,也就是说可以通过标签页可以通过注解来声明虚拟路径
package cc.java.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Dmeo") public class Dmeo extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ServletContext与ServletConfig
java是一门面向对象的语音,万事万物皆对象。整个JavaWeb工程也可以用一个对象来表示,这个对象就是ServletContext类型。
我们可以在web.html文件中给某一个Servlet配置一些配置信息,当服务器被启动的时候,这些配置信息就会被封装代某一个ServletConfig对象中去。因此ServletConfig表示的是某一个Servlet的配置文件
创建一个新的Servlet类的
- ServletContext对象:表示的是整个JavaWeb工程
- ServletConfig对象:表示的是某一个Servlet中的配置文件
1.获取代表某一个JavaWeb工程的ServletContext对象 context代表着整个javaweb工程,context对象是一个域对象,可以往某一个域对象中存放数据,并且还可以取出存放数据
2.往context域对象中存放数据
3.取出context域对象中的数据
因为ServletContext代表的是整个工程,所以另一个Servlet也可以直接调用,通过key-value的方式
ServletConfig对象需要通过xml来配置后才能使用,在之前创建的xml中,通过标签的来配置。只要需在xml文件中添加一下标签即可
一旦Servlet类被启动,这两个参数就会被封装一个对象中 这个对象就是Demo3Servlet中的ServletConfig
配置好xml文件后,在Demo3Servlet.java中使用ServletConfig
转发和重定向
相同点:转发和重定向都是实现页面跳转,也就是说当我们访问Serlvet的时候,Servlet帮我跳转到另一个jsp页面,而跳转就需要通过转发和重定向来实现。
不同点:
实现转发调用的是HttpServletRequest对象中的方法,实现重定向调用的是HttpServletResponse
转发时浏览器中的url地址栏是不会发生改变,重定向时浏览器中的url地址会发生改变
转发时向浏览器请求一次服务器,重定向时向浏览器请求两次服务器
首先先创建两个jsp页面,用来实现密码正确和错误
然后在LonginServlet.java进行业务逻辑判断
如果usename=admin password=1234 跳转到success.jsp,否则跳转到fail.jsp,通过转发来实现跳转。
request.getRequestDispatcher(“/sccess.jsp”).forward(request, response); 其实(“/sccess.jsp”)中的”/”代表项目工程
无论是输入正确或者错误的密码后,浏览器的地址并没有跳转到sccess.jsp或者fail.jsp中,这就是转发的特点
把else中的语句换一下,换成response.sendRedirect(“/zhumeng-servlet1/fail.jsp”);
response比较特殊需要把工程名全写上才能实现效果。
当输入账号和密码错误的时候,使用重定向来跳转网页,此时浏览器上的url地址发生了变化