【学习笔记】Servlet

碎知识点

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本身。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值