servlet简介:java服务器小程序,主要用于生成动态web内容。因为web页面基于用户提交数据,web页面数据频繁改变,页面信息来自于数据库,所以我们需要动态创建web页面。
serlvet功能:读取客户端发来的显示信息(表单数据),读取客户端发来的隐式信息(请求头信息),生成相应结果,发送显示xi信息给客户端(html),发送隐式信息给客户端(状态码和请求头信息)。
Servlet 读取表单数据
Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:
- getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
- getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
- getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
servlet标注:name是可选属性
@WebServlet(name="MyServlet",urlPatterns={"/my"})
或者
@WebServlet("/MyServlet")
ServletConfig:从Servlet内部获取到初始参数的值
@WebServlet(name = "ServletConfigDemoServlet",
urlPatterns = { "/servletConfigDemo" },
initParams = {
@WebInitParam(name="admin", value="Harry Taciak"),
@WebInitParam(name="email", value="admin@example.com")
}
)
@WebServlet(name = "ServletConfigDemoServlet",
urlPatterns = { "/servletConfigDemo" },
initParams = {
@WebInitParam(name="admin", value="Harry Taciak"),
@WebInitParam(name="email", value="admin@example.com")
}
)
servlet中最常用的方法:getParameter是在ServletRequest中最常用的方法。该方法通常用于返回HTML表单域的值,也可以用于获取查询字符串的值,用下面这个语句,可以通过Servlet内部获取id值。
String id = request.getParameter("id");
默认情况下,PrintWriter对象使用ISO-8859-1编码。
提交表单两种常用方法:
get:将请求参数显示在url中,调用servlet的doGet方法,不安全
post:不在url中显示请求信息,调用servlet的doPostt方法,安全
Servlet生命周期:加载实例化Servlet(创建一个servelt实例)——调用init()方法(仅调用一次)——调用service方法(doPost或者doGet,调用多次,每次请求调用)——调用destroy方法(销毁servlet,tomcat关闭执行)
页面导航3种方式:
1、请求重定向:工程之外,不共享request里面的数据
resp.sendRedirect("http://www.baidu.com");
2、请求转发:设置了共享变量,变量不会传到新页面。比如两个servlet分别设置共享变量“你好”,“你也好”,请求转发到页面只能输出其中一个变量
req.getRequestDispatcher("/Success.html").forward(req, resp);
3、请求包含:包含success页面,如果设置了共享变量,变量会传到新页面输出。比如两个servlet分别设置共享变量“你好”,“你也好”,请求转发到页面两个变量都能输出
req.getRequestDispatcher("/Success.html").include(req, resp);
setvlet3个作用域 :
ServletContext:范围最大,应用程序级别,整个应用程序都能访问
HttpSession:范围次之,会话级别,在当前浏览器中能访问
HttpServletRequest:范围最小,请求级别,请求结束,变量作用域也结束
//请求结束作用域结束
req.setAttribute("R_name", "R_value");
//会话 客户端和服务器断开作用域结束
HttpSession session = req.getSession();
session.setAttribute("S_name", "S_value");
//全局 所有用户共享
ServletContext cxt = this.getServletContext();
cxt.setAttribute("SC_name", "SC_value");
下面写个例子,通过servlet实现页面输出,项目结构图如下
HelloServlet代码
package com.servlet;
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 {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = request.getRequestURI().toString();
System.out.println(url);//打印路径
//打印输出流
PrintWriter out = response.getWriter();
out.print("hello servlet");
}
}
html页面,submit,button,a标签都实现了跳转输出
<!DOCTYPE html>
<html>
<head>
<title>helloServlet.html</title>
<script type="text/javascript">
function test(){
var f = document.forms[0];
f.action="servlet/HelloServlet"
f.submit();
}
</script>
</head>
<form action="servlet/HelloServlet">
<input type="submit">
<!-- button没有提交功能 onclick动作事件调用test() -->
<input type="button" onclick="test();" value="hello">
</form>
<hr>
<a href="servlet/HelloServlet">link</a>
<body>
</body>
</html>
下面这个是个生命周期小例子,项目结构图如下
html页面代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body> <!-- method有post或者get -->
<form action="servlet/BasicServlet" method="post">
<table>
<tr>
<td>Name</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="Password" name="password"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit"></td>
</tr>
</table>
</form>
</body>
</html>
servlet代码
package com.basic;
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 BasicServlet extends HttpServlet {
//构造方法
public BasicServlet() {
System.out.println("BasicServlet");
}
/*//service里判断是doget方法还是都post方法,会覆盖dopost和doget
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
super.service(arg0, arg1);
}*/
public void destroy() {
System.out.println("destroy");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("include");
String name = request.getParameter("name");
if(name!=null&&name.equals("kaite")){
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else{
response.sendRedirect("http://www.baidu.com");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("include");
String password = request.getParameter("password");
if(password!=null&&password.equals("qaqa")){
//请求包含
request.getRequestDispatcher("/BasicService.html").include(request, response);
}else{
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
//初始化一个方法
public void init() throws ServletException {
// 从配置文件里读取全局参数 最大作用域
String bigname = this.getServletContext().getInitParameter("context");
System.out.println(bigname);
//从配置文件里读取局部参数
String name = this.getInitParameter("name");
System.out.println(name);
System.out.println("init");
}
}
配置文件里配置了一个全局变量和一个局部变量
<servlet>
<servlet-name>BasicServlet</servlet-name>
<servlet-class>com.basic.BasicServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>anwser</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>BasicServlet</servlet-name>
<url-pattern>/servlet/BasicServlet</url-pattern>
</servlet-mapping>
控制台输出