本文是学习Java时所记录的学习笔记,本节Servlet的基础内容,包括基本简介和基本实现以及servlet相关的重要内容。只提取了部分我觉得是重点的内容,欢迎留言、私信交流~
Servlet简介
什么是Servlet?
- Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器。
- 主要功能在于交互式地浏览和生成数据,生成动态Web内容。
- 是J2EE中13个功能模块之一
- (常用)
- Servlet web服务器小程序
- JSP 服务器页面
- JDBC 数据库交互模块
- XML XML交互模块
- (相对较少使用)
- EJB 企业级Java Bean
- RMI 远程调用
- JNDI 目录服务
- JMS 消息服务
- (基本不使用)
- JTA 事务管理
- JavaMail 发送/接收Email
- JAF 安全框架
- CORBA CORBA集成
- JTS CORBA事务监控
Servlet具体实现
配置Tomcat+JDK+Eclipse环境
安装Tomcat和JDK
- 安装JDK8
- 官网:oracle.org
- 下载JAVA 8版本
- 如果是安装包,安装后即可使用。如果是压缩包,解压后,需要配置环境变量指向压缩后的位置。
- 具体安装流程省略。(可以搜索“安装JDK教程”)
- 安装Tomcat 8.x(与JDK8对应版本)
在Eclipse IDE上关联JDK
- 打开Eclipse IDE。
- 点击“Windows”菜单,选择“Perferences”。
- 在左侧搜索“Installed JREs”并进入。
- 在左侧点击“Add”,选择“Standard VM”,点下一步。在“JRE home”处选择对应的JAVA文件位置。然后点击底部的“Finish”。
- 此时java和Eclipse绑定在了一起。
在Eclipse中关联Tomcat
- Windows菜单-Show View-找到Servers选项。
- 屏幕下方出现“Servers”标签。点击里面的链接。
- 弹出的界面中,选择Apache-对应的Tomcat版本。next
- 设置名称和tomcat安装路径,JRE选择对应的JDK。next
- 用于程序发布,可以不管。Finish
- 设置完成后,底部Servers标签会有对应的项目。双击内容。
- Server Locations模块修改为第二个“Use Tomcat installation(takes control of Tomcat installation”(意思为发布到Tomcat安装路径下)。修改Deploy Path为apache路径文件中的webapps文件中。关闭-保存。
- 验证:底部右侧的启动按钮。(推荐使用Debug启动)
- 验证:访问网页localhost:8080,能正常访问则表示成功。
创建JAVA WEB工程
新建项目
- 在eclipse,右键-new-Dynamic Web Project
- Project name:工程名称(例如:qqfh)
- Target runtime:选择对应的apache Tomcat版本
- next
- 不更改,next。
- 勾选“Generate web.xml deployment descriptor”,意思为生成web描述文件。finish。
创建标准Servlet
- 选择FirstServlet-Java Resources-src-右键-new-class
- Package:包名(例如:com.qqfh)
- Name:类名(例如:qqfhController)
- finish
- 继承父类:HttpServlet (import javax.servlet.http.HttpServlet;)
- 重写方法:Source-Override/Implement Methods…
- 勾选service(HttpServletRequest,HttpServletResponse)
- 重写内容:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受请求发来的参数
String category = request.getParameter("category");
//指定返回给浏览器的内容
String html = "<h1>hi,"+category+".";
PrintWriter wr = response.getWriter();
wr.println(html);//将指定的内容发送回浏览器
}
- (如果执行这一步,就不用执行第7步)更新WebContent/WEB-INF/web.xml文件,添加内容:
<servlet>
<servlet-name>shopservlet</servlet-name>
<servlet-class>com.qqfh.servlet.ServletProj</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>shopservlet</servlet-name>
<url-pattern>/ShopSelvlet</url-pattern>
</servlet-mapping>
- 使用注解的方式可以简化配置(这步和第6步只使用一种即可,如果执行第7步,则无需执行第6步)。在Servlet类的上一行添加@WebServlet注释即可。
//引入包
import javax.servlet.annotation.WebServlet;
//在Servlet类的上一行添加以下注解
@WebServlet("/ShopSelvlet") //告诉tomcat映射的地址是ShopSelvlet
运行项目
- 右键底部Servers标签的内容-Add and Remove
- 选择左侧的项目,放到右边。(意思为发布)。finish
- 成功则底部会多一个项目。
- 点击底部Servers右侧的debug。
- 访问:localhost:8080/FirstServlet/hi?name=jackson
Servlet相关知识
Java Web标准工程结构
目录/文件 | 说明 |
---|
tomcat安装目录/webapps/ | Tomcat应用根目录 |
/web应用目录/ | JavaWeb应用目录 |
/web应用目录/index.html | jsp |
/WEB-INF | WEB应用安全目录,用于存放配置文件 |
/WEB-INF/web.xml | 部署描述符文件,是web项目核心配置文件。 |
/WEB-INF/classes | 存放编译后的classes文件 |
/WEB-INF/lib | 存放web应用依赖的jar文件 |
/MATE-INF/MAINFEST.MF | 包含Web应用的版本等信息 |
Servlet生命周期
- 装载 - web.xml
- 创建 - 构造函数
- 初始化 - init()
- 提供服务 - service()
- 销毁 - destory()
请求的结构
- HTTP请求包含三部分:
- 请求行:请求方法、请求URL、HTTP协议及版本。
- 请求头:辅助信息(语言、操作系统和浏览器、内容长度、cookie等)
- 请求体:数据内容(POST请求才会有内容)
- HTTP响应包含三部分:
- 请求行:报文协议及版本、状态码及描述。
- 请求头:辅助信息(内容信息、时间、内容长度等)
- 请求体:数据内容
- HTTP常见状态码:
- 200 服务器处理成功
- 404 无法找到文件
- 500 内部服务器错误
- 403 服务器拒绝访问
- 301、302 请求重定向
- 400 无效的请求
- 401 未经过授权
- 503 服务器超载或正停机维护,无法处理请求
- 请求头中的ContentType
- 服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
值 | 说明 |
---|
text/plain | 纯文本 |
text/html | HTML文档 |
text/xml | XML文档 |
application/xmsdownload | 需要下载的资源 |
image/jpeg | 图片资源 |
Servlet类详解
//重写service方法,可以同时处理GET和POST传进来的数据。
service(HttpServletRequest request, HttpServletResponse response){}
//重写doGet方法,用于专门处理Get请求的方法
doGet(HttpServletRequest request, HttpServletResponse response){}
//重写doPost方法,用于专门处理POST请求的方法
doPost(HttpServletRequest request, HttpServletResponse response){}
//以下在重写service、doGet或doPost方法后,在重写的方法内经常使用的一些语句。
//HttpServletRequest类的request对象常用方法如下
request.getParameter() //接收request请求中的单个参数
request.getParameterValues() //接收多个同名参数,返回String数组
request.getCookies() //获取所有Cookie信息,返回一个Cookie数组。
request.getSession() //获取用户会话的Session对象(HttpSession类型)
request.getServletContext() //返回ServletContext对象
request.getRequestURL() //获取当前访问的URL,返回StringBuffer对象,可通过toString转成String。
request.getMethod() //获取传输方法(get/post)
request.getAttribute("username") //获取请求中属性名为username的值,返回一个Object对象。
request.getHeader("User-Agent") //获取User-Agent信息,返回字符串。
request.setContentType() //设置文本信息(用于告诉浏览器内容是属于什么文本)
request.setAttribute("username","admin") //设置一个请求属性名为username,值为admin
request.setCharacterEncoding("utf-8"); //设置Post请求的编码格式
//HttpServletResponse类的response对象常用方法如下
response.setContentType("text/html; charset=utf-8"); //设置响应的编码格式
response.addCookie() //向浏览器写入,传入一个Cookie类型的对象
//极其常用的语句
//请求转发中浏览器只会发送一次请求,处理请求的Servlet1会在内部进行转发到Servlet2,再又浏览器2直接回应请求给浏览器,浏览器的地址栏会显示第一个请求的地址。
request.getRequestDispatcher().forward() //请求转发
//响应重定向中浏览器发送一次请求后,处理请求的Servlet1会回复Servlet2的地址给浏览器,浏览器接收后再次发送一次请求给Servlet2,此时浏览器的地址栏会变为第二个请求的地址。
response.sendRedirect() //响应重定向
Java Web三大作用域对象
- HttpServletRequest 请求对象(Tomcat响应后就被销毁)
- HttpSeesion 用户会话对象(默认30分钟未被访问就销毁)
- ServletContext web应用全局对象(web应用程序重启或关闭会被销毁)
ServletContext
- ServletContext(Servlet上下文对象),是Web应用全局对象,不会随着某一个session失效而消失。
- ServletContext类对应的是内置对象application。
- ServletContext类(javax.servlet)
方法 | 说明 |
---|
ttribute(“copyright”,“2018 baidu.com”) | 设置自定义全局属性 |
ttribute(“copyright”) | 获取copyright属性的值,返回Object对象。 |
nitParameter(“copyright”) | 获取应用程序全局属性copyright的值,返回String类型 |
web.xml配置说明
- //设置servlet
- //指定对应的java类名
- //绑定URL。可以设置成“/pattren/*”,表示后面部分任意字符都可以处理。
- //设置servlet映射
- //设置欢迎页列表
- //设置应用程序的全局参数
- //指定错误页面
- //指定错误代码
- //指定对应的访问文件:例如“/error/404.html”
JSP九大内置对象
序号 | 内置对象 | 说明 |
---|
1 | request | 请求对象-HttpServletRequest |
2 | response | 响应对象-HttpServletResponse |
3 | session | 用户会话-HttpSession |
4 | application | 应用全局对象-ServletContext |
5 | out | 输出对象-PrintWrtier |
6 | page | 当前页面对象-this |
7 | pageContext | 页面上下文对象-PageContext |
8 | config | 应用配置对象-ServletConfig |
9 | exception | 应用异常对象-Throwable(只能在错误页面isErrorPage="true"中使用) |