一,servlet的基本原理
①客户端与web层的交互
说的具体点,就是浏览器与Web服务器的交互。所谓服务器,通俗点理解就是别人家的电脑。那么这个交互过程就可以理解为你通过你的浏览器来访问别人的电脑。你使用浏览器发送http请求(request),服务器给你回应(response)。浏览器根据response刷新页面。
②web层与商务逻辑层的交互
这个名词其实我看也很陌生,就这么说吧,之前说了客户端与web层的交互,服务器需要向浏览器返回一个response,那么这个response怎么来?这就需要商务逻辑层来解决这个问题。这个名词是一个抽象的名词,具体的体现就比如我的电脑上装了tomcat,tomcat是一个容器,在tomcat下的webapp下我放了我的项目在里面,也就是我们用eclipse写的web程序。(servlet)这就构成了一个商务逻辑层。web层把收到的request请求交给商务逻辑层,这一个层做逻辑判断得到一个结果返回web层,web层再将结果交给浏览器解释显示。
③商务逻辑层与数据库的交互
举一个登录的例子,浏览器发送request请求,把账号密码发给服务器,服务器通过tomcat创建一个servlet实例,servlet程序拿到request参数,然后在数据库中查找核对相应信息,判断该怎么返回。当然,并不是所有的商务逻辑都需要用到数据库。
想要详细了解servlet的同学可以百度百科servlet
二,用eclipse写servlet程序
开发环境:myeclipse 2015(不得不说,不能懒一辈子,还是下载eclipse)
1)左上角File->new->Web Project
2)填写project name 然后next->next
3)在下图的页面把个都勾选上,然后就可以finish了
4)在这个src文件夹下new->servlet->填写package name和class name->finish
5)配置配置文件,打开web.xml
6)点一下左下角的Source,这样就可以编辑代码了,当然如果你看的懂那个design视图也可以忽略这一步
7)在<web-app></web-app>标签里面找到<servlet-mapping></servlet-mapping>里面是这种形式
<url-pattern>servlet/class name</url-pattern>
意思是说你访问这个servlet的时候地址应该写/project name/servlet/class name
比如我的工程名称是testServlet,这里写mapping是TEST/mytest那么浏览器的地址应该写http://localhost:8080/testServlet/TEST/mytest
8)鼠标右键->run as->myeclipse server application
9)如果运行的页面不对会出错,这时需要检查浏览器的地址
10)这里是因为这是一个例子,他有自带的函数处理。函数可以自行修改。
三,Servlet过滤器
具体的可以查看右边连接的博客,我也盗了一个图 点击打开链接
前面提到过4个层,这个过滤器就存在于web层与商务逻辑层之间。他可以过滤掉我们不想看到东西,比如不想让某个主机访问我的某个service,不登录禁止某些功能等等。
1)
如果仔细看了之前写的servlet的基本原理,那么会发现我写了tomcat初始化一个servlet实例,那么这个初始化怎么在程序中体现呢?当然,系统有默认的函数帮我们实现,但是为了实现我们想要的过滤功能,就必须重写这个函数。在初始化实例的时候先调用Init()函数,request请求完成的时候调用destroy() 函数。
2)新建一个类完成过滤器功能
new->class
3)可能是我环境出了问题还是什么,我不能给它添加一个Filter 的接口,所以好多东西需要自己手动添加
然后让它实现Filter接口
点这个filter导入一个javax.servlet.Filter包
接下来还有错误,需要点击错误add unimplemented method
4)开始重写这3个函数
首先init函数
这里要做的就是保存配置文件里的过滤相关的配置信息(config是我给这个类添加的一个成员变量,让类的其他函数能够使用到这个配置信息)
然后destroy函数,这个没什么好说的
最后关键部分doFilter()函数
这个函数应该很快就能看懂,首先获取远程主机的地址。然后把远程主机的址与配置文件里面的参数作比较。最后做出相应的逻辑处理。
5)完成web.xml里面的filter部分(如果web.xml没有filter部分就不会执行doFilter函数,所以这个部分是必须的)
好吧,我本来是打算写过滤MAC地址的,但是我不知道怎么获取远程主机的MAC。至于怎么获取远程的信息就用request对象点出来。获取配置文件的信息就用FilterConfig对象里面的getInitParam("")里面的参数与param-name对应。