索引
Servlet(Server Applet)全称Java Servlet,是用Java编写的服务器端程序。广义上指任何实现了Server接口的类。
客户端向服务器发送请求 ??服务器接收请求并启动相应的Servlet ?? 服务器生成相应返回给客户端
public interface Servlet
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable
public abstract class HttpServlet extends GenericServlet
public class YourServlet extends HttpServlet
可以直接实现Servlet接口,开发中一般继承HttpServlet抽象类
public class FirstServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化Servlet
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//处理请求
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
//销毁Servlet
}
}
如果没有建立映射关系,客户端无从请求该服务!在web.xml文件中servlet和servlet-mapping标签中添加相应的子标签来表达映射关系。
<servlet>
<servlet-name>服务名</servlet-name>
<servlet-class>完整Servlet实现类路径</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>服务名</servlet-name>
<url-pattern>/url请求名</url-pattern>
</servlet-mapping>
请求的大致过程:请求名 ?? 服务名 ?? Servlet
url请求名是客户端的请求渠道
服务名是服务器端中服务的名字,对于客户端是透明的
一个服务可以对应多个请求
?? 请注意请求名的格式是否正确!否则Tomcat服务器启动失败。报错信息为:Error during artifact deployment. See server log for details.
?? <url-pattern>/login</url-pattern>
?? <url-pattern>/mytest/login</url-pattern>
? <url-pattern>login</url-pattern>
? <url-pattern>/*.jsp</url-pattern>
? <url-pattern>/mytest/*.jsp</url-pattern>
?一定要有 /
,一般仿照前两个正确案例命名即可,更多命名规则可以参考博文(点击此处)。
下面是配置文件的案例。在这个配置文件中我定义了一个请求名 /myTest 与实现类 FirstServlet 建立映射关系。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>boringTest</servlet-name>
<servlet-class>com.java.webtest.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>boringTest</servlet-name>
<url-pattern>/myTest</url-pattern>
</servlet-mapping>
</web-app>
http://localhost/myTest
NOTE 后就可以看到测试效果了。前文展示了Servlet的五个方法,也尝试写简单的请求。但是有一个问题没有讲清楚:客户只是发送了请求,但没有指导Servlet去执行哪个方法,这是为什么?其实中间还有一个没说的环节就是Servlet容器。Servlet接口是面向Servlet容器的,不是客户端。容器负责管理Servlet对象。
service()
方法service()
方法。请求对象和响应对象对后端开发比较友好,简化了操作。init()
方法 ??执行service()
方法service()
说明:如果你继承的是HttpServlet并直接继承了它实现的service()
,方法会判断客户端的请求方式,调用相应的doGet()
/doPost()
方法destroy()
方法进行销毁HttpServletRequest接口拓展了ServletRequest
String
getParameter(String name)
从表单获取单值数据NOTE
String[]
getParameterValues(String name)
从表单获取多值数据
void
setCharacterEncoding(String charset)
指定每个请求的编码(仅对POST生效)
RequestDispatcher
getRequestDispatcher(String path)
跳转并返回RequestDispatcher对象,该对象的 forward()
方法用于转发请求,用法如下
request.getRequestDispatcher("../success.jsp").forward(request,response);
void
setAttribute(String key, Object value)
存值
Object
request.getAttribute(String key)
取值,取出后需要强转类型
GET:不安全的提交方式,url地址栏可见? ?? 。直接参照百度搜索,例如搜索框中搜索关键字 嫦娥 后地址栏变为 ??
https://www.baidu.com/s
?wd=嫦娥
&rsv_spt=1
&rsv_iqid=0xa2e58ae0001350d0
&issp=1
&f=8&rsv_bp=1
... ...
看见 ?wd=嫦娥
了吗(我特意换行是为了展示清除,实际都是一行鸭)。可以提炼出基本格式
网址.../请求名?key1=value1&key2=value2&key3=value3&...
GET提交方法:① 表单 ② a标签 ③ 手动地址栏拼接 ④ js提交
POST:相对安全的提交方式,url地址栏不可见 ?? 。通过前端页面提交POST表单
GET & POST 的区别:POST更安全、传输大小不限制,GET不安全、传输数据大小受URL长度限制限制
设定字符集,仅对POST请求数据生效:setCharacterEncoding("UTF-8")
对字符串转换字符集:String s = new String(req.getParameter(key).getBytes("ISO-8859-1"),"GBK")
NOTE
直接修改Tomcat的 server.xml 配置文件中的字符集NOTE
HttpServletResponse接口拓展了ServletResponse,声明了向客户端向客户端发送响应状态码、响应消息头、响应消息体的方法。
void
addCookie(Cookie var1)
给这个响应添加一个cookie
void
sendRedirect(String var1)
发送一条响应码,将浏览器跳转到指定的位置
PrintWriter
getWriter()
获得流对象,再调用对象的 write()
方法向响应页面中写入内容NOTE
void
setContentType(String var1)
设置响应内容的类型
跳转页面有转发和重定向两种方式。
req.sendRedirect(url)
重定向见名知意,是指让客户端重新定向。完整的重定向过程:
? 1?? 客户端第一次请求
? 2?? 服务器得到请求并返回一个URL
? 3?? 客户端使用第一次返回的URL进行第二次请求
? 4?? 服务器得到请求并返回“最终结果” NOTE
重定向需要客户端两次请求,转发只需要客户端一次请求,请求的处理在服务器端就完成了。
? 区别:重定向会导致request丢失(第一次的HttpServletRequest请求对象),而转发不会,因为转发使用了.forward(req,resp)
方法传递了请求对象。
HttpRequest对象可以存值,但是在重定向后HttpRequest对象丢失,其中的数据也随之丢失。很多时候需要一个更持久的对象来存值,可以使用session对象。会话概念:从打开浏览器到关闭浏览器,期间访问服务器就称为一次会话。
获取session对象:
ServletRequest接口定义了获取方法 HttpSession
getSession()
,在ServletRequest对象上调用得到一个会话对象 session = req.getSession()
。
void
setAttribute(String key,Object value)
存值
Object
getAttribute(String key)
取值
void
removeAttribute(String key)
移除值
String
getId()
获取session的id,id是服务器判定是否是同一次会话的依据
void
setMaxInactiveInterval(int interval)
设置session的非活动时间NOTE (单位:秒)NOTE
int
getMaxInactiveInterval()
获取session的非活动时间(单位:秒),默认为30分钟
void
invalidate()
终止session,使session失效
通过req.setCharacterEncoding("utf-8")的方式设置字符集的方式不便于后期维护和修改,可以通过初始化参数实现
web.xml 文件中定义servlet标签子标签init-param
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
在Servlet初始化方法init()中加入代码获取初始化参数
@Override
public void init(ServletConfig config) throws ServletException {
encoding= config.getInitParameter("encoding");
...
}
web.xml 文件中定义与servlet标签同级的context-param标签
<context-param>
<param-name>globalEncoding</param-name>
<param-value>utf-8</param-value>
</context-param>
获取初始化参数
@Override
public void init(ServletConfig config) throws ServletException {
bianhao=config.getServletContext().getInitParameter("globalEncoding");
...
}
前面在配置文件中建立映射和其他参数的步骤比较麻烦。Servlet 3.0用注解解决了这个问题。
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。
属性 | 类型 | 说明 |
---|---|---|
asyncSupported | boolean | 是否支持异步操作模式 |
displayName | String | Servlet显示名称 |
initParams | webInitParam[] | 配置初始化参数 |
loadOnStartup | int | 容器加载Servlet的优先级(默认值0,在请求时加载) |
name | String | 指定Servlet名称 |
urlPatterns / value | String[] | 指定Servlet处理的url |
/**
* 初始化参数注入后的使用方式与前面在web.xml中定义后的使用方式完全相同
* 其他参数注入后的效果也和在web.xml中定义的效果相同
* 使用注解注解注入配置更方便开发
* urlPatterns是String[]类型,可以配置多个映射,例如{"/user/test" , "/user/example"}
*/
@WebServlet(
name = "myUserServlet",
urlPatterns = {"/user/test"},
loadOnStartup = 1,
initParams = {
@WebInitParam(name="name", value="小明"),
@WebInitParam(name="pwd", value="123456")
}
)
public class UserServlet implements HttpServlet {
...
}
?? 最后一句话:你的推荐??和评论??对我真的很重要,一起努力学习进步吧!??????
原文:https://www.cnblogs.com/dai-blog/p/Servlet-analysis-use.html