Servlet学习
servlet通用配置方法
通用配置方法就是servlet3.0以下版本需要在web.xml中配置
- 得写一个Web工程 , 要有一个服务器。
- 测试运行Web工程
- 新建一个类, 实现Servlet接口
- 配置Servlet , 用意: 告诉服务器,我们的应用有这么些个servlet 在webContent/WEB-INF/web.xml里面写上以下内容。
- 为什么要做配置?
答:必须将请求路径和java程序的对应关系建立起来。
servlet与普通的java程序的区别
1.必须实现servlet接口
2.必须在servlet容器(服务器)中运行
3.servlet程序可以接收用户请求参数以及向浏览器输出数据
代码实现servlet的步骤
得写一个Web工程 , 需要有一个服务器(tomcat服务器)。(我创建的工程名是06_servlet/)
- 在工程下创建com.lanou3g包,在包下创建一个类实现 Servlet接口
- 定义一个类
- 继承HttpServlet
- 重写doGet 和 doPost
package com.lanou3g;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得GET请求参数
String name = req.getParameter("name");
//设置响应类型和编码
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<h1>Hello servlet!我是"+name+",正在学习Servlet!</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 切记,不用调用父类的同名方法(因为父类中没有做任何逻辑处理,只是简单返回了一个错误) !!!
//super.doPost(req, resp);
// 设置POST请求编码
req.setCharacterEncoding("UTF-8");
// 如果POST方式请求和GET方式请求,后台处理的业务逻辑一样的话,这里可以直接调用doGet
doGet(req, resp);
// 如果业务逻辑和GET方式不一样
// do something...
}
}
- 在web.xml中配置书写好的servlet
<!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是com.lanou3g.HelloServlet -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.lanou3g.HelloServlet</servlet-class>
</servlet>
<!-- 注册servlet的映射。 servletName : 找到上面注册的具体servlet, url-pattern: 在地址栏上的path 一定要以/打头 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 在WebContent下面创建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="common/common.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet学习</title>
</head>
<body>
<h1>GET请求</h1>
<%-- 用相对路径访问HelloServlet --%>
<a href="hello?name=林俊杰">HelloServlet(相对路径)</a>
<br />
<%-- 用绝对路径访问HelloServlet(JSP中的绝对路径是从端口号后面开始) --%>
<a href="${pageContext.request.contextPath }/hello?name=大黑子">HelloServlet(绝对路径)</a>
<br />
</body>
</html>
注意:把项目添加到tomcat服务器中才能在浏览器中访问
7. 在浏览器地址栏中输入http://localhost:8080/06_servlet/
就可以看到如下所示
相对路径(路径名中没有完整)
绝对路径(路径中的url完整)这是我的理解,如果不对请指出。
用servlet3.0的方式继续学习servlet
在com.lanou3g包中继续创建一个类
- 定义一个类(HelloServlet3)
- 继承HttpServlet
- 重写doGet 和 doPost
package com.lanou3g;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet3.0写法
* @author John
*
*/
@WebServlet("/hello3") // 代替了在web.xml中servlet相关的配置
public class HelloServlet3 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 6673712407112700149L;
/**
* 处理Get请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取GET请求参数
String name = req.getParameter("name");
// 设置响应类型和编码
resp.setContentType("text/html;charset=UTF-8");
// 获取输出对象
PrintWriter out = resp.getWriter();
out.println("<h1>Hello Servlet3!, 我是"+name+", 正在学习Servlet!</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 切记,不用调用父类的同名方法(因为父类中没有做任何逻辑处理,只是简单返回了一个错误) !!!
// super.doPost(req, resp);
// 设置POST请求编码
req.setCharacterEncoding("UTF-8");
// 如果POST方式请求和GET方式请求,后台处理的业务逻辑一样的话,这里可以直接调用doGet
doGet(req, resp);
// 如果业务逻辑和GET方式不一样
// do something...
}
}
在index.jsp中添加
<%-- 用相对路径访问Servlet3方式配置的Servlet --%>
<a href="hello3?name=小二黑">HelloServlet3(相对路径)</a>
在浏览器地址栏中输入http://localhost:8080/06_servlet
3.0版本比之前的减少了在web.xml中配置,直接用注解的方式代替减少的代码的书写量,
POST请求
在index.jsp中写入代码
<h1>POST请求</h1>
<form action="hello" method="post">
用户名: <input type="text" name="name" /> <br />
<input type="submit" value="提交" />
</form>
<form action="hello3" method="post">
用户名: <input type="text" name="name" /> <br />
<input type="submit" value="提交" />
</form>
在浏览器地址栏中输入http://localhost:8080/06_servlet
servlet的执行流程如下图
测试作用域
创建ScopeServlet
package com.lanou3g;
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("/scopeServlet")
public class ScopeServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -1762583971178468134L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
// 放到request、session、application作用域
req.setAttribute("name", name);
//session作用域
// req.getSession().setAttribute("name", name);
//application作用域
// req.getServletContext().setAttribute("name", name);
// 请求作用域中的数据必须使用请求转发(forward)的方式才能带过去
req.getRequestDispatcher("result.jsp").forward(req, resp);
// 请求重定向的方式无法将请求作用域数据带到页面
// resp.sendRedirect("result.jsp");
}
}
在index.jsp中添加
<a href="scopeServlet?name=王二狗子">测试作用域</a>
再创建一个result.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="common/common.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet学习</title>
</head>
<body>
<h1>${name },欢迎您!</h1>
</body>
</html>
在浏览器地址栏中输入http://localhost:8080/06_servlet