6.1 Servlet项目的准备
- 新建项目ServletTest1
选择Web应用程序,添加
添加jsp和servlet 两个jar包
③ Servelt项目准备工作完成啦
④ 最后一步,部署tomcat
6.2 Servlet部署
6.2.1 部署的两种方式
- ① 在web.xml中部署Servlet,该文件在WEB-INF下(作者部署之后打开jsp文件出了毛病)
给loginServlet通过xml方式部署(红色方框)
对于这种方式的部署,你会发现有点麻烦,所有的代码文件都需要自己手动书写,效率不高
- ② 基于注解的方式部署(推荐)
6.2.2 部署相关标记的说明
- <web.xml>根标记
部署东西都往这里写就对了
- servlet标记和子标记servlet-name,servlet-class
servlet里面放子标记,对应一些信息
servlet-name给他一个别名、有点像通过类创建的实例名
servlet-class根据那个类创建的
- servlet-mapping标记和子标记
servlet-mapping:内容就是告诉电脑把哪个部署到服务器了
servlet-name :这里面的就是跟电脑说我上一步创建的实例我要部署服务器了
url-pattern:部署到服务器之后访问的方式
- @WebServlet
书写方式:@WebServlet(name="loginServlet",urlPatterns={"/second"})
解释,为啥他就这么简单,只有两个东西呢。
因为你是在本类中书写,自然不用指定哪个类,给个名字,然后部署咋访问就行啦
6.3 通过JSP访问Servlet
6.3.1 实例:login.jsp和loginServlet
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login.jsp</title>
</head>
<body>
<form action="../loginServlet">
账号:<input type="text" name="user"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
package servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "loginServlet", value = "/loginServlet")
public class loginServlet extends HttpServlet {
private static final long serialVersionUID=1L;
protected void service(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.println("请输入用户名");
}
else if (password==null||password.length()==0){
out.println("请输入密码");
}
else if (name.length()>0&& password.length()>0){
if (name.equals("zhangsan")&& password.equals("123456")){
out.println("信息输入正确");
}else{
out.println("信息输入错误");
}
}
out.println("</body></html>");
}
}
6.3.2 Servlet中的service和doPost,doGet方法
① service方法
服务器在接收Servlet请求之后,产生新线程,调用service()方法为请求做出相应。service()方法首先检查HTTP请求类型(get or post),然后根据类型调用doGet()和doPost()方法。所以,我们现在主流的方式是直接书写doPost()和doGet()方法
② doPost()和doGet()
通常情况下,无论请求方式为get或是post,服务器的处理过程都完全相同,那么我们就可以只在doPost()中书写处理过程,然后doGet()只需要再调用doPost()方法即可
下面是代码示例
package servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "loginServlet", value = "/loginServlet")
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected 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.println("请输入用户名");
}
else if (password==null||password.length()==0){
out.println("请输入密码");
}
else if (name.length()>0&& password.length()>0){
if (name.equals("zhangsan")&& password.equals("123456")){
out.println("信息输入正确");
}else{
out.println("信息输入错误");
}
}
out.println("</body></html>");
}
}
6.6 重定向和转发
6.6.1 为啥要重定向?转发又是怎么做的
假如你提交的信息需要通过你的loginServlet后再到另一个界面,那么这时候就需要通过重定向的方式来保留原本的request存储的一些信息,不同过这种方式的信息无法保留
① 创建转发对象
RequestDispatcher dis=request.getRequestDispatcher(String url)
② 调用方法,将信息传递,并跳转
dis.forward(request,response)
6.6.2 重定向实践
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>redirectForward.jsp</title>
</head>
<body>
<form action="../RedirectForwardServlet" 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>
package servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "RedirectForwardServlet", value = "/RedirectForwardServlet")
public class RedirectForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
String name=request.getParameter("user");
String password=request.getParameter("pwd");
if (name==null||name.length()==0){
response.sendRedirect("jsp/redirectForward.jsp");
} else if (password==null||password.length()==0) {
response.sendRedirect("jsp/redirectForward.jsp");
} else if (name.length()>0&&password.length()>0) {
RequestDispatcher dis=request.getRequestDispatcher("ShowServlet");
dis.forward(request,response);
}
}
}
package servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "ShowServlet", value = "/ShowServlet")
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected 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("您的账号是:"+name);
out.println("您的密码是:"+password);
}
}
6.7 基于Servlet的MVC模式
6.7.1 MVC模式组成
- 模型:一个或多个JavaBean对象,用于存储数据(实体模型,由JavaBean类创建)和处理业务逻辑
- 视图:一个或多个JSP页面,向控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean标记来显示数据。
- 控制器:一个或多个Servlet对象,根据视图提交的请求进行控制,即将请求转发给业务逻辑的JavaBean,并将处理结果存放到实体模型JavaBean中,输出给视图显示。
6.7.2 MVC实例
User类用于创建实体模型存储用户信息
package Model;
public class User {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
UserCheck类用于判断用户名和密码是否正确,代码如下:
package Model;
import Model.User;
public class UserCheck {
public boolean validate(User user){
if (user!=null&&user.getName().equals("JSPMVC")){
if (user.getPwd().equals("MVC")){
return true;
}else
return false;
}else {
return false;
}
}
}
LoginCheckServlet完成请求控制,代码如下:
package servlet;
import Model.User;
import Model.UserCheck;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "LoginCheckServlet", value = "/LoginCheckServlet")
public class LoginCheckServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("user");
String password=request.getParameter("pwd");
User user=new User();
user.setName(name);
user.setPwd(password);
UserCheck userCheck=new UserCheck();
if(userCheck.validate(user)){
request.setAttribute("user",user);
RequestDispatcher dis=request.getRequestDispatcher("jsp/loginSuccess.jsp");
dis.forward(request,response);
}else {
response.sendRedirect("jsp/loginCheck.jsp");
}
}
}
登录页面loginCheck.jsp的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>loginCheck.jsp</title>
</head>
<body>
<form action="../LoginCheckServlet" 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>
登录成功页面loginSuccess.jsp的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>loginSuccess.jsp</title>
</head>
<body>
<jsp:useBean id="user" type="Model.User" scope="request"/>
恭喜<jsp:getProperty name="user" property="name"/>登陆成功!
</body>
</html>