前言
Java Servlet的核心思想就是在Web服务器端创建用来响应用户请求的对象,而该对象就被称为一个Servlet对象;而原本一个用户在访问JSP页面时Web服务器就会自动生成一个Java文件,而编译它则会创建一个Servlet对象,但是为了满足我们要实现的特定功能,所以就需要我们自主编写特定的Servlet。
创建运行一个最简单的Servlet
Servlet示例代码:
package servletTest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstServlet extends HttpServlet{
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response)throws IOException {
response.setContentType("text/html;charset=utf-8");//响应类型
PrintWriter out= response.getWriter();
out.println("<html><body>");
out.println("第一个Servlet");
out.println("</body></html>");
}
}
完成了我们的Servlet类的编写,接下来我们还需要在XML文件里配置此Servlet的相关信息才行。
相关配置内容保存在我们项目的WebContent\WEB-INF\的web.xml中。
我们需要在此文件中的标记中加入以下代码:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>servletTest.MyFirstServlet</servlet-class><!-- 包名加类名 -->
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name><!-- 有一个servlet标签就必须有一个对应的mapping -->
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
在配置完成后我们就可以运行我们的Servlet了,我们通过直接通过映射地址访问:http://localhost:8080/JavawebTest(此为项目名)/firstServlet(此为要使用的Servlet的mapping名字)
通过一个JSP页面来访问我们的Servlet
而在访问之前我们一定要了解我Servlet的生命周期:
- 初始化Servlet对象
当Servlet第一次被加载时服务器会创建一个Servlet对象,该对象会调用init方法初始化。 - service方法响应请求
创建的Servlet会再调用service根据get或者post调用doGet和doPost来响应用户请求。 - Servlet对象消亡
当服务器关闭时,会调用destroy方法结束自己的生命。
注:
1、init、service、destroy方法都是HTTPServlet类中的方法都可根据自己的需要进行重写。
2、对于一个请求Servlet的用户init方法只会在被创建时被执行一次,而service则会每次请求service都被执行,而且不同用户访问Web服务器时都会为不同用户建立新的线程,不同用户在不同的线程中执行互不干扰。
3、HTTP请求类型是get那么service就会调用doGet方法响应,同理请求post就用doPost响应,所以一般没有必要重写service,根据需要重写doGet和doPost就可以。
需要用JSP页面访问Servlet时,只需要把我们表单响应的action改为我们的web.xml中对应Servlet的中的的值就可以对应到我们的Servlet上请求响应。用一个登录验证的例子:
<!--加在<servlet-mapping>中-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>servletTest.LoginServlet</servlet-class><!-- 包名加类名 -->
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name><!-- 有一个servlet标签就必须有一个对应的mapping -->
<url-pattern>/isLogin</url-pattern><!--表单action写isLogin,执行判断登录的Servlet-->
</servlet-mapping>
<servlet>
<servlet-name>show</servlet-name>
<servlet-class>servletTest.ShowUser</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/showuser</url-pattern>
</servlet-mapping>
//JSP页面表单:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="isLogin" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="user"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="pwd"/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td><input type="reset" value="重置"/></td>
</tr>
</table>
</form>
</body>
</html>
//LoginServlet.java内容:
package servletTest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
response.setContentType("text/html;charset=utf-8");//响应类型
PrintWriter out= response.getWriter();
request.setCharacterEncoding("UTF-8");
String name =request.getParameter("user");
String password = request.getParameter("pwd");
out.println("<html><body>");
if(name==null||name.length()==0) {
out.print("请输入用户名");
}
else if(password==null||password.length()==0)
{
out.print("请输入密码");
}
else if(name.length()>0&&password.length()>0) {
if(name.equals("yangyang")&&password.equals("iloveyou")) {
out.println("信息输入正确");
RequestDispatcher dispatcher = request.getRequestDispatcher("showuser");//获得RequestDispatcher对象dispatcher,转发到名为showuser的Servlet
dispatcher.forward(request, response);//dispatcher对象调用forward方法实现转发
}else {
out.print("信息输入错误");
}
}
out.println("</body></html>");
}
}
这样就完成了一个小的Servlet应用。
session在Servlet中的使用
首先会话对象session可以再jsp页面中不作声明直接使用,而在Servlet类中必须先使用request对象获得用户的会话对象,然后再使用它:
HttpSession session=request.getSession(true);
注:我们在一个Web项目中,一个用户可以访问多个不同的Servlet,但是用户获取的session对象都是想用的,但是不同的用户session不同,利用这点我们可以轻松在多个页面调用session中所存储的值。比如:
在A页面我们有以下代码:
HttpSession session=request.getSession(true);
session.setAttribute("Username", name);//将name的值存入session中名叫"Username"
接着我们在B页面调用:
HttpSession session=request.getSession(true);
String name=(String)session.getAttribute("Username");//从session中拿到Username的值
到这里我们最基础的Servlet就讲完了,全部为基础核心内容,如有不解欢迎交流。