碎知识点
Servlet是运行在Web服务器端的Java应用程序,可以生成动态Web页面,属于客户端和服务器响应的中间层
JSP在底层就是一个Servlet
直接访问Servlet属于get方法
Servlet的配置是通过web.xml文件来实现的。web.xml在WebRoot/WEB-INF
下面。
<servlet-name>
可以随便取名,但是<servlet>
和<servlet-mapping>
的<servlet-name>
要对的上。
<url-pattern>
也不一定是Servlet的包路径。
仅在第一次运行的时候会执行构造函数+doGet()
,第二次(不关闭服务器的情况下)不执行构造函数,仅执行doGet()
。(AKA:不管访问多少次,只创建一个对象。)
🤡大傻逼:只生成一个对象,再多用户访问的时候是否会造成等待等问题?
🤔大聪明:不会,因为Servlet采用多线程机制。每一次请求系统就会分配一个线程来运行doGet()
。注意,这样会造成安全问题,因此,不要再Servlet中定义成员变量,除非这些成员变量是所有用户公用的。(因为多用户都用一个对象)
Servlet有两个处理方法:doGet()
和doPost()
注意,可以使用application实现服务器内跳转,常用的Servlet内跳转有以下两种:
(1)重定向
response.senRedirect("URL")
对应JSP隐含对象sendRedirect()
这种方法的URL需要将虚拟目录的根目录写进入。如ProjectName/yesmola.jsp
(2)服务器跳转(对应JSP隐含对象的forward()
)
ServletContext application = this.getServletContext();
RequestDispatcher rd = application.getRequestDispatcher("URL");
rd.forward(request, response);
这种方法写URL不需要虚拟目录的根目录,如/yesmola
9.1
JSP运行过程(与Servlet的关系)
运行JSP时,服务器底层会将JSP编译成一个Java类,这个类就是Servlet。
Servlet是运行在Web服务器端的Java应用程序,可以生成动态Web页面,属于客户端和服务器响应的中间层。可以说Servlet就是JSP,二者可以实现同样的页面效果,但是通过JSP实现成本要低得多。
9.2
一个普通的类不可能成为Servlet,除非…
(1)继承HttpServlet
import javax.servlet.http.HttpServlet;
public class WelcomeServlet extends HttpServlet{}
(2)重写HttpServlet的doGet()
方法。
直接访问Servlet属于get方法
doGet()
的可访问性是protected
返回值是void
...
public class WelcomeServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
}
}
写完后的Sevlet无法直接访问,除非…
写完后的Servlet不能直接访问,需要配置才能通过URL映射到与之对应的Servlet中。
Servlet的配置是通过web.xml文件来实现的。web.xml在WebRoot/WEB-INF
下面。
web.xml的结构
<? xml version...?>
<web-app version...>
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>serlets.WelcomeServlet</serclet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/servlets/WelcomeServlet</url-pattern>
</servley-mapping>
</web-app>
表示给servlets.WelcomeServlet取名为WelcomeServlet,访问时以http://server:port/ProjectName/servlets/WelcomServlet 访问。
<servlet-name>
可以随便取名,但是<servlet>
和<servlet-mapping>
的<servlet-name>
要对的上。
<url-pattern>
也不一定是Servlet的包路径。
部署Servlet后文件去哪了
Servlet部署后Servlet的class文件都会在服务器Tomcat相应项目的“Web-INF/classes”下面,src目录下的所有源文件也同样。
Servlet运行机制
增加一个构造函数
...
public class Yesmola extends HttpServlet{
public Yesmola(){
//注意构造函数语法
}
public void doGet(... request, ... response) throws ...
}
仅在第一次运行的时候会执行构造函数+doGet()
,第二次(不关闭服务器的情况下)不执行构造函数,仅执行doGet()
。(AKA:不管访问多少次,只创建一个对象。)
🤡大傻逼:只生成一个对象,再多用户访问的时候是否会造成等待等问题?
🤔大聪明:不会,因为Servlet采用多线程机制。每一次请求系统就会分配一个线程来运行doGet()
。注意,这样会造成安全问题,因此,不要再Servlet中定义成员变量,除非这些成员变量是所有用户公用的。(因为多用户都用一个对象)
🌟Sevlet生命周期
Sevlet方法分为以下几类:
init()方法
一个Servlet在服务器中只会驻留一个实例,在第一次调用Servlet的时候会创建一个实例,HttpServlet的init()
方法会被调用。可以将初始化代码放在这里面。
doGet()/doPost/service()方法
Servlet有两个处理方法:doGet()
和doPost()
doGet()
在以get方式请求Servlet时运行。
doPost()
你猜?
客户端对Servlet发送一个请求,服务器端将开启一个线程调用service()
方法。service()
会判断调用doGet()
还是doPost()
。
destroy()方法
destroy()
在Servlet实例消亡的时候自动调用。Servlet实例消亡之前还有活要干(比如断开数据库)就可以重写destroy()
方法。
9.4
如何获取out对象
你可能会书:Out对象不是jsp隐式对象嘛?为啥要获取?
但是咱就是一个在Servlet的.java里写代码的大动作,不是写jsp!!!所以还是要获取Out,注意out是JSP的隐式对象,不是Servlet的!!
...
doGet(...) throws ...{
PrintWriter out = response.getWriter();
//使用out对象
}
但是打不出中文,是因为没有编码
...
doGet(...) throws ... {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
//使用Out对象
}
获取request和response对象
非常容易,因为doGet(HttpServletRequest request, HttpServletResponse response)
已经获取了。(doPost()
同理)
获取session对象
session对象对应HttpSession
接口。
import javax.servlet.http.HttpSession; //import语句也有分号结尾
...
doGet(...) throws ... {
HttpSession session = request.getSession();
...
}
获取application对象
application对象通过ServletContext
接口获取。
import javax.servlet.ServletContext;
...
doGet(...) throws ... {
ServletContext application = this.getServletContext();
...
}
注意,可以使用application实现服务器内跳转,常用的Servlet内跳转有以下两种:
(1)重定向
response.senRedirect("URL")
对应JSP隐含对象sendRedirect()
这种方法的URL需要将虚拟目录的根目录写进入。如ProjectName/yesmola.jsp
(2)服务器跳转(对应JSP隐含对象的forward()
)
ServletContext application = this.getServletContext();
RequestDispatcher rd = application.getRequestDispatcher("URL");
rd.forward(request, response);
这种方法写URL不需要虚拟目录的根目录,如/yesmola
设置欢迎页(Landing Page)
跟web.xml有关系
<? xml version... ?>
<web-app version...>
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>eat-ass.jap</welcome-file>
<!--当有多个welcome-file的时候,第一个找不到会继续往后寻找welcome-file直到找到为止 -->
</welcome-file-list>
</web-app>
9.6
设置参数
和系统有关的信息最好保存在配置文件中。web.xml又来了。
设置全局参数,所有的Servlet都可访问
<context-param>
<param-name>参数名</p-n>
<param-value>参数值</p-v>
</c-p>
必须在web.xml的最上方写。
设置局部参数,只有相应的Servlet可以访问
<servlet>
<servlet-name>yesmola</..>
<servlet-class>balabala</..>
<init-param>
<param-name>参数名</...>
<param-value>值</...>
</i-p>
</servlet>
获取参数
获取全局参数
ServletContext application = this.getServletContext();
application.getInitParameter("参数名");
获取局部参数
this.getInitParameter("参数名");
this
指的是Servlet本身。