您现在的位置是:主页 > news > 学做日本菜的网站好/徐州网站优化
学做日本菜的网站好/徐州网站优化
admin2025/4/27 6:31:04【news】
简介学做日本菜的网站好,徐州网站优化,动态网站转静态,开发程序员培训班什么是Servlet? Servlet是基于Java语言的Web语言的Web服务器端编程技术,它是运行在Servlet容器中的Java类,它能处理Web客户的HTTP请求,并产生HTTP响应。 Servlet对Request的处理和Response过程分为 接受HTTP请求取得请求信息&a…
什么是Servlet?
Servlet是基于Java语言的Web语言的Web服务器端编程技术,它是运行在Servlet容器中的Java类,它能处理Web客户的HTTP请求,并产生HTTP响应。
Servlet对Request的处理和Response过程分为
- 接受HTTP请求
- 取得请求信息,包括请求头和请求参数数据
- 调用其他Java类方法,完成具体的业务功能
- 实现到其他Web组件的跳转(包括重定向和请求转发)
- 生成HTTP响应(包括HTML或非HTML响应)
Servlet容器
Servlet运行在服务器端,由Servlet容器所管理,Servlet容器也叫Servlet引擎,是Web服务器或应用程序的一部分,用于在发送的请求和响应之上提供网络服务、解码基于MIME的请求、格式化基于MIME的响应。
创建第一个Servlet实例
创建步骤
- Servlet创建之前应该先配置好tomcat服务器(网上有免安装版的,下载一个即可)
- 创建好动态Web项目(Dynamic Web Project)(建议使用MyEclipse或Idea),别忘了勾选web.xml文件。
- 剩下的和编写Java的时候很想,不过是从创建Class,变成了创建Servlet
- 如果使用的是MyEclipse,创建Servlet时,doGet()和doPost()就已经写好了
package cn.sdut.servlet;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("/FirstServlet")//注解方式,Servlet3以上版本可使用,对应Tomcat7以上
public class FirstServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().append("Served at: ").append(request.getContextPath());}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
什么都不用写,编译器已经帮我们写好了,运行试试。
Servlet体系结构
Servlet的主要接口和类之间的关系
Servlet接口
Servlet接口规定了必须由Servlet类实现并且由Servlet引擎识别和管理的方法集;
Servlet接口的基本目标是提供与Servlet生命周期相关的方法,如:init()、service()和destory()等。
方法名称 | 方法描述 |
---|---|
init(ServletConfig config) | Servlet初始化方法,在Servlet实例化后,容器调用该方法进行Servlet的初始化,init()方法只能被调用一次,如果此方法没有正常结束,就会抛出一个ServletException,一旦抛出该异常,Servlet将不在执行,随后对其进行再次调用,容器会重新载入并再次运行init()方法。 |
service(ServletRequest req,ServletResponse resp) | Servlet的服务方法,当用户对Servlet发出请求时容器会调用该方法处理用户的请求 |
destroy() | Servlet的销毁方法,容器在终止Servlet服务前调用此方法,容器调用此方法前必须给service()线程足够的时间来结束执行,因此接口规定当service()正在执行时,destory()不被执行 |
getServletConfig() | 此方法可以让Servlet在任何时候获得ServletConfig对象 |
getServletInfo() | 此方法返回一个String对象,该对象包含Servlet的信息,如:开发者、创建日期、描述信息等。该方法可用于容器 |
GenericServlet抽象类
GenericServlet概述
- GenericServlet是一个通用的协议无关的Servlet,它实现了Servlet和ServletConfig接口。
- 继承自GenericServlet的Servlet应该要覆盖service()方法。
GenericServlet的常用方法
方法名称 | 功能描述 |
---|---|
public void init(ServletConfig config) | 调用Servlet接口中的init()方法。此方法还有一无参的重载方法,其功能与此方法相同 |
public String getInitParameter(String name) | 返回名称为nam的初始化参数的值 |
public ServletContext getServletContext() | 返回ServletContext对象的引用 |
HttpServlet抽象类
HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了对HTTP协议的处理,它比Servlet接口的功能更为强大。
HttpServlet类中的主要方法及描述:
方法 | 方法描述 |
---|---|
service(HttpServletRequestreq,HttpServletResponseresp | HttpServlet在实现Servlet接口时,重写了service()方法,该方法会自动判断用户的请求方式;若为GET请求,则调用HttpServlet的doGet()方法;若为POST请求,则调用doPost()方法。因此,开发人员在编写Servlet时,通常只需要重写doGet()或doPost()方法,而不要去重写service方法。如果Servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。 |
doGet(HttpServletRequestreq,HttpServletResponseresp) | 此方法被本类的service()方法调用,用来处理一个HTTPGET操作。 |
doPost(HttpServletRequestreq,HttpServletResponseresp) | 此方法被本类的service()方法调用,用来处理一个HTTPPOST操作。 |
HttpServlet作为HTTP请求的分发器,除了提供对GET和POST请求的处理外,对于其他请求类型也提供了相应的处理方法(如:doHead()、doOptions()、doDelete()、doPut()、doTrace())。
测试
1.编写一个Servlet,当用户请求该Servlet时,显示用户于哪年那月几点几分从哪个IP(InternetProtocol)地址连接至服务器。
package cn.sdut.servlet;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;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("/CountServlet")
public class CountServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//可以方便地修改日期格式String curdate = sdf.format(date); response.getWriter().append(curdate).append("用户从ip地址").append(request.getRemoteAddr()).append("连接至服务器");response.getWriter().write("<br>"+"请求用户的主机名:"+request.getRemoteHost());response.getWriter().write("<br>"+"请求用户的主机使用的网络端口号:"+request.getRemotePort());response.getWriter().write("<br>"+"web服务器的ip地址:"+request.getLocalAddr());response.getWriter().write("<br>"+"web服务器的主机名:"+request.getServerName());response.getWriter().write("<br>"+"web服务器的的网络端口号:"+request.getServerPort());response.getWriter().write("<br>"+"使用的协议"+request.getProtocol());response.getWriter().write("<br>"+"请求的url地址"+request.getRequestURL());}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
Servlet声明配置
- 在web.xml中配置
- 注解配置
Servlet基本应用
处理超链接请求数据
处理Form表单请求数据
- Form表单在enctype属性缺省或取值为application/x-www-form-urlencoded情况下,无论是Get请求类型还是Post请求类型,均通过HttpServletRequest对象来获取请求数据。
- 超链接一般用于获取/查询资源信息,属于GET请求类型,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连。由于其安全性(如:请求数据会以明文显示在地址栏上)以及请求地址的长度限制,一般仅用于传送一些简单的数据;
- Form表单一般用于更新资源信息,默认使用GET请求类型,多使用POST请求类型。由于POST请求类型理论上没有数据大小限制,可用表单来传较大量的数据;
示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body><form action="LoginServlet" method="post">用户名:<input type="text" name="user">密 码 :<input type="password" name="pwd"><br>期望城市:<input type="checkbox" name="cities" value="qingdao">青岛<input type="checkbox" name="cities" value="beijing">北京<input type="checkbox" name="cities" value="shanghai">上海<input type="checkbox" name="cities" value="guangzhou">广州 <input type="submit" value="登录" ><br></form>
</body>
</html>
package servlet;import java.io.IOException;
import java.util.Arrays;import javax.servlet.RequestDispatcher;
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("/LoginServlet")
public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)request.setCharacterEncoding("utf-8");//请求头中文不乱码,(数据库中)String uname = request.getParameter("user");String pwd = request.getParameter("pwd");String[] city = request.getParameterValues("cities");System.out.println(uname+pwd+Arrays.toString(city));if(uname.equals(pwd)) {response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));}else {response.getWriter().append(uname+"登陆失败!");}
// RequestDispatcher dispatcher = request.getRequestDispatcher("MainSerlvet");
// dispatcher.forward(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
请求转发和重定向
请求转发
请求转发是指将请求再转发到其他地址,转发过程中使用的是同一个request请求,转发后浏览器地址栏内容不变。
更改一下代码,html不变
package servlet;import java.io.IOException;
import java.util.Arrays;import javax.servlet.RequestDispatcher;
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("/LoginServlet")
public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)
// request.setCharacterEncoding("utf-8");//请求头中文不乱码,(数据库中)
// String uname = request.getParameter("user");
// String pwd = request.getParameter("pwd");
// String[] city = request.getParameterValues("cities");
// System.out.println(uname+pwd+Arrays.toString(city));
// if(uname.equals(pwd)) {
// response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));
// }else {
// response.getWriter().append(uname+"登陆失败!");
// }RequestDispatcher dispatcher = request.getRequestDispatcher("MainSerlvet");dispatcher.forward(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
在写一下MainServlet
package servlet;import java.io.IOException;
import java.util.Arrays;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("/MainServlet")
public class MainServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");//响应头中文不乱码(网页中)request.setCharacterEncoding("utf-8");//强求头中文不乱码,(数据库中)String uname = request.getParameter("user");String pwd = request.getParameter("pwd");String[] city = request.getParameterValues("cities");System.out.println(uname+pwd+Arrays.toString(city));if(uname.equals(pwd)) {response.getWriter().append(uname+"登陆成功!").append(Arrays.toString(city));}else {response.getWriter().append(uname+"登陆失败!");}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
效果一样,url依然为LoginServlet
重定向
重定向通过HttpServletResponse对象的sendRedirect()方法实现,该方法会通知客户端去重新访问新指定的URL地址。
sendRedirect()方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
package servlet;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("/LoginRedirectServlet")
public class LoginRedirectServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("https://blog.csdn.net/qq_40657585/article/details/100981472");//重定向到站外}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);}}
Servlet核心接口
Servlet几个重要的接口简介:
- ServletConfig接口:用于获取Servlet初始化参数和ServletContext对象;
- ServletContext接口:代表当前Servlet运行环境,Servlet可以通过ServletContext对象来访问Servlet容器中的各种资源;
- HttpServletRequest接口:用于封装HTTP请求信息;
- HttpServletResponse接口:用于封装HTTP响应消息。
ServletConfig接口
javax.servlet.ServletConfig接口的定义为:
- publicabstractinterfacejavax.servlet.ServletConfig
- 容器在初始化一个Servlet时,将为该Servlet创建一个唯一的ServletConfig对象,并将这个ServletConfig对象通过init(ServletConfigconfig)方法传递并保存在此Servlet对象中。
在容器对Servlet进行初始化时,会创建一个SerlvetConfig对象,传入到init方法中,保存在Servlet对象中
常用方法
- getInitParameter(String name) 根据初始化参数名读取初始化参数值
- getServeltContext() 获取servlet的设备上下文对象
ServletConext接口
Servlet的上下文,代表servlet的运行环境,是servlet与容器进行通信的接口,web容器中,一个项目所有的servlet共享同一个servletcontext对象。
获取应用范围内的初始化参数(所有的servlet都可以获取到的初始化参数在web.xml中使用<context-param>配置的初始化参数)
1、在web.xml中使用<context-param><context-param><param-name>myname</param-name><param-value>jiangweijie</param-value></context-param>
2、在本项目的任意一个Servlet中都可以获取该参数的值
首先获取ServletContext,有两种方法:
- 使用ServletConfig对象中的getServletContext()方法
- 直接使用getServletContext()方法
然后使用ServletContext对象的getInitParameter(string name)方法获取应用的初始化参数值。
设置和获取应用域的属性值
- setAtrribute(name,value) 将名为name值为value属性加入到应用域中
- getAttribute(name) 从应用域中获取名字为name的属性值
- removeAttribute(name) 从应用域中删除名为name的属性
注意:应用域中的属性,本项目中的所有的servlet都可以操作(读,改,删除)