Servlet学习笔记
Servlet学习笔记
Servlet 简介
Servlet 是运行在 Web 服务器端的 Java 应用程序,它使用 Java 语言编写,具有 Java 语言的优点。与 Java 程序的区别是,Servlet 对象主要封装了对 HTTP 请求的处理,并且它的运行需要 Servlet 容器(tomcat)的支持,在 Java Web 应用方面,Servlet 的应用占有十分重要的地位,它在 Web 请求的处理功能方面也非常强大。
Servlet 的创建十分简单,创建一个普通的 Java 类,使这个类继承 HttpServlet 类并根据需要重写父类的 doGet()或 doPost()方法,再通过手动配置 web.xml 文件注册 Servlet 对象,以告知 Web 容器哪一个请求调用哪一个 Servlet 对象处理。
Servlet 的配置包含在 web.xml文件中,主要通过以下两步进行设置。
<!--声明Servlet-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.hx.MyServlet</servlet-class>
</servlet>
<!--映射Servlet-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
声明 Servlet 对象在 web.xml 文件中,通过标签声明一个 Servlet 对象。在此标签下包含两个主要子元素,分别为与 其中,元素用于指定 Servlet 的名称,该名称可以为自定义的名称;元素用于指定 Servlet 对象的完整位置,包含 Servlet 对象的包名与类名。
在 web.xml 文件中声明了 Servlet 对象后,需要映射访问 Servlet 的 URL 该操作使用标签进行配置。标签包含两个子元素,分别为与。其中,元素与标签中的元素相对应,不可以随意命名。元素用于映射访问 URL。
案例:将 jsp 页面的登录过程用 Servlet 实现一下
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(rep, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if ("admin".equals(name) && "123".equals(pwd)){
request.getSession().setAttribute("user",login);
response.sendRedirect("index.jsp");
}else {
response.sendRedirect("login.jsp");
}
}
}
案例:Servlet 直接向浏览器响应 HTML 字符串
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class TestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.write("<h1>hello world!</h1>");
}
}
Servlet 是使用 Java Servlet 接口运行在 Web 应用服务器上的 Java 程序,其功能十分强大,它不但可以处理 HTTP 请求中的业务逻辑,而且还可以输出 HTML 代码来显示指定页面。而 JSP 是一 种在 Servlet 规范之上的动态网页技术,在 JSP 页面中,同样可以编写业务逻辑处理 HTTP 请求,也可以通过 HTML 代码来编辑页面,在实现功能上,Servlet 与 JSP 貌似相同,实质存在一定的区别,主要表现在以下几方面。
- 角色不同:JSP 页面可以存在 HTML 代码与 Java 代码并存的情况,而 Servlet 需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态内容输出为静态的 HTML,所以,JSP 更具有显示层的角色。
- 编程方法不同:Servlet 与 JSP 在编程方法上存在很大的区别,使用 Servlet 开发 Web 应用程序需要遵循 Java 的标准,而 JSP 需要遵循一定脚本语言规范。
- Servlet 需要编译后运行:Servlet 需要在 Java 编译器编译后才可以运行,如果 Servlet 在编写完成或修改后没有被重新编译, 则不能运行在 Web 容器中。而 JSP 则与之相反,JSP 由 JSP Container 对其进行管理,它的编辑过程也由 JSP Container 对 JSP 进行自动编译,所以,无论 JSP 文件被创建还是修改,都不需要对其编译即可运行。
- 速度不同:由于 JSP 页面由 JSP Container 对其进行管理,在每次执行不同内容的动态 JSP 页面时,JSP Container 都要对其自动编译,所以,它的效率低于 Servlet 的执行效率。而 Servlet 在编译完成之后,则不需要再次编译,可以直接获取及输出动态内容。在 JSP 页面中的内容没有变化的情况下,JSP 页面的编译完成之后,JSP Container 不会再次对 JSP 进行编译。
注意:在响应过程中如果出现中文乱码,需要设置 response.setCharacterEncoding(“UTF-8”);和 response.setContentType(“text/html;charset=UTF-8”);关于请求的方法,点击 a 标签跳转,或直接在浏览器地址栏输入地址并回车,这样的请求方式是 get 请求。post 请求一般有表单提交且表单指定请求方式为 post 或者 ajax 请求。
练习:
1.注册校验练习:创建项目 demo3 并编写一个注册模块,注册页 register.jsp,jsp 里面有 username,password,repsssword,telephone。提交之后转到 servlet。servlet 判断 password 与 repassword 是否相同和电话号码为 11 位。如果都符合,显示"注册成功"。否则显示"密码与确认密码不一致或手机号不合法"。
参考代码:
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
</head>
<body>
<form action="register" method="post">
<input name="username"/>
<br/>
<input name="password"/>
<br/>
<input name="repassword"/>
<br/>
<input name="telephone"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
RegisterServlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String repassword = request.getParameter("repassword");
String telephone = request.getParameter("telephone");
if (repassword != null && repassword.equals(password) && telephone != null && telephone.length() == 11) {
response.getWriter().write("<h1>注册成功</h1>");
return;
}
response.getWriter().write("<h1>密码与确认密码不一致或手机号不合法</h1>");
}
}
、
重定向与转发
重定向表示当前访问的资源没有权限获取操作成功后需要浏览器跳转到指定的 jsp 或 servlet,这种跳转是由于后台返回了一个 code 为 302 的响应头,并且在响应头中告知浏览器跳转地址。浏览器主动跳转。 使用如下语法即可完成重定向:
response.sendRedirect("login.jsp");
转发是描述 jsp 与 servlet 之间的关系,该转发的逻辑如下,当我们访问 jsp页面时,页面没有相关的数据展示,于是我们的请求便指向 servlet 的地址,servlet 调用相关组件获取数据,然后将数据存入 request 中,jsp 页面再将 request 中的数据渲染出一张有数据的 html 页面。这样各司其职也正是 java 提出的高内聚、低耦合的编程思想。使用如下语法即可完成请求转发:
request.getRequestDispatcher("index.jsp").forward(request, response);
注意:转发时浏览器地址不发生变化,重定向时由于浏览器发送了两次请求,所以不能在 request 里面存放数据。
案例:转发传值
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("id", 12);
request.setAttribute("name", "张三");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>INDEX</title>
</head>
<body>
<p>id:<%=request.getAttribute("id")%>
</p>
<p>name:${name}
</p>
</body>
</html>
案例:登录表单回填
login.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>LOGIN</title>
</head>
<body>
<form action="login">
<input name="name" type="text"
value="${name}"/>
<input name="password" type="text"
value="<%=request.getAttribute("password")==null?"":request.getAttribute("password")%/>">
<input type="submit" value="提交"/>
</form>
</body>
</html>
servlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String password = request.getParameter("password");
if ("123".equals(password)) {
request.getSession().setAttribute("userInfo", name);
response.sendRedirect("index.jsp");
return;
}
request.setAttribute("name", name);
request.setAttribute("password", password);
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
练习:
1.创建项目 demo4 编写一个 index.jsp 页面,输入圆的半径以 post 请求提交给一个 Servlet。Servlet 对半径进行判定,若为 null 或 <=0 的数,重定向到 index.jsp 页面,若为 >0 的值,则转发到 success.jsp 页面,并显示其面积、周长。
参考代码:
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<form action="check" method="post">
<input name="number"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
CheckServlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io