一、servlet基础
在web开发的过程时,编写jsp页面可实现动态页面。原理是将java代码嵌入到html代码中,这样一个页面中,既要编写逻辑代码又要编写显示标记代码,往往篇幅很长。而且在其中一部分需要改动的时候,往往会牵扯到其他的地方,使修改变得很麻烦,代码可读性也很差。
我们希望能将java代码和html代码进行分离,并按功能分开存放,使代码结构清晰,增强可读性。
servlet就这样产生了,它是连接前端和后台的中间部分,可以看做是jsp的底层,jsp中的java代码是在底层实现了这样一个类之后进行运行的。现在我们直接编写这个类,就可以了。
将java代码分离出来之后,可以进行重复调用,也可以实现对很多页面的统一处理。
什么是servlet?
servlet是能完成一个功能的一个类,它有4个方法,初始化方法,销毁方法,doGet(),doPost(),用来实例化。它的访问方法有,直接访问,表单提交。直接访问是get方式,表单提交可以设置为get方式或者post方式。
编写servlet:
1.继承HttpServlet类
2.实例化doPost()、doGet()方法,完成servlet的实质功能。
配置servlet:
<servlet> <servlet-name>buyServlet (给servlet取一个名字)</servlet-name> <servlet-class>servlet.buyServlet (servlet类的路径)</servlet-class> </servlet> <servlet-mapping> <servlet-name>buyServlet (跟上面一样的名字)</servlet-name> <url-pattern>/buyServlet (写一个访问路径)</url-pattern> </servlet-mapping>
访问下面这个访问路径就可以调用到上面那个类了。
什么是过滤器?
过滤器就是用来对多个页面进行统一处理的的类。
编写过滤器:
1.实现filter接口
import javax.servlet.Filter;
public class testFilter implements Filter {
}
2.重写doFilter方法
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("中国字哦~");
chain.doFilter(request, response);
}
配置过滤器:
<filter> <filter-name>encodingFilter (取一个名字)</filter-name> <filter-class>filter.encodingFilter (过滤器类的路径)</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter (跟上面相同的名字)</filter-name> <url-pattern>/buyBasket.jsp (写要顾虑的页面的路径)</url-pattern> </filter-mapping>
与servlet配置的不同之处,仅在于,<url-pattern></url-pattern>标签中放置的是,需要被过滤的路径,并且这个路径可以是一个包的形式比如/*。
什么是监听器?
监听器是用来编写,当页面中的某些动作发生时,需要发生的伴随处理的。
编写监听器:
1.实现HttpSessionListener接口,当然还有HttpSessionAttributeListener接口,ServletContextListener接口,ServletContextAttributeListener接口。分别用于监听不同的事件。
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener{
}
2.重写方法
public void sessionCreated(HttpSessionEvent event) {
// TODO Auto-generated method stub
//对session进行初始化;
HttpSession session = event.getSession();
HashMap<String,book> books = new HashMap<String,book>();
session.setAttribute("books",books);
session.setAttribute("money",null);
}
配置监听器:
<listener> <listener-class>listener.SessionListener</listener-class> </listener>
监听器的配置非常简单,因为它是对内置的几个对象的动态的监听,不需要设置相关的url。
二、开发一个例子中注意的问题
开发一个购物车的例子,例子中存在三张页面。(1)显示所有图书页面(每本书显示书号,书名,单价,后面包含购书按钮);(2)购买某种书页面(显示该书书名,价钱,购书数量输入框,提交按钮);(3)购物车页面(显示所有别添加到购物车中的书单,包含书号,书名,单价,数量,还有购书总价钱)。
例子中包含两个servlet,初始化InitServlet,BuyOneBookServlet。
数据库的设计,考虑到三个页面的需要,图书的数据库中包含书号,书名,单价,数量四个字段。
在各个页面,和前后台的数据传递中,如果用session传值的话,需要(1)查询出所有的图书列表”allbook“(2)放入购物车的所有图书的列表”books“(3)购物车中图书的总价钱”money“(4)购单类书信息”book“。session中可存放的变量的种类是可以不一样的,但是对于列表类的变量,我们便于索引就采用了HashMap类型。
在servlet之前放置了encodingFilter用来过滤各页面的编码。
在filter中要注意的问题,必须把编码设置response.setCharacterEncoding("")放在所有request.getWriter()之前,不然会影响整个网页页面的编码。