Servlet是sun公司提供的用于开发动态web资源的组件Sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源需要完成以下2个步骤1:编写一个实现Setvlet接口或继承HttpServlet的java类2:将开发好的java类部署到web服务器上Serclet执行过程1:浏览器与服务器建立连接2:浏览器打包数据3:向服务器发送请求4:服务器接收请求拆包5:创建requset和response对象6:创建Servlet对象,并调用其init()方法完成初始化7:调用Servlet类的service()方法8:返回处理结果9:打包数据10:向浏览器发送响应11:浏览器拆包12:关闭连接13:显示内容第2,3步时我们要设置请求方式和编解码方式请求方式是浏览器向服务器请求时的意向说明,告知服务器如何处理及解析提交的数据,通常使用get和post来设置,get请求资源,post提交要处理的数据在提交中文数值时,浏览器会对中文参数进行编码,而web服务器会默认使用iso-8859-1进行解码,编解码方式是就会出现乱码,我们一般在服务器拆包前使用req.setCharacterEcoding(“utf-8”)来设置解码方式,在发送响应数据时res.setContentType(“text/html;charset=“utf-8”)来设置编码方式第4,5步是Servlet处理请求数据服务器接到请求数据后会解释成两个对象,一个是与请求数据对应的httpServletRerust对象,一个是与响应数据对应的HttpServletResponse对象.请求中的所有消息都封装在httpServletRerust对象中,通过这个对象的相关方法可以获得请求数据,例如:读取请求行,消息头信息,获取路径信息等System.out.println(req.getMethod());获取网名System.out.println(req.getServletPath());获取统一资源标识符System.out.println(req.getRequestURI());获取统一资源定位符(URL=IP+port+URI/路径)System.out.println(req.getRequestURL());获得请求参数值的方法getparameter(StringparaName)和getparametervalues(StringparaName)后者多用于获取提交的表单中复选框的值第10步发送响应数据在服务器为浏览器提供响应时,回传的数据包中的状态行里面是302状态码,同时在消息头内会增加一个键值对,名称为Location,值是一个新的URL地址。浏览器遇见302状态码之后,会立即按照Location头信息中指定的URL地址发送新的一个请求,这样一个在接到响应后又立即发出请求的过程叫做重定向。使用如下代码即可实现重定向的过程:response.sendRedirect(Stringurl);Servlet容器处理请求资源路径:有三种方式精确匹配:资源路径名称与Web.xml文件中url-pattern严格匹配相等通配符匹配:使用*来匹配0或多个字符,达到批量匹配路径的效果后缀匹配:在配置url-pattern时不使用/用*.来匹配任意多个字符多Servlet合并,实现步骤:1.使用后缀模式修改web.xml文件,将更多的servlet配置节点删除,只保留一个节点即可2.分析请求资源,调用不同的分支处理代码Servlet的生命周期,共有四个阶段1.创建Servlet对象2.分配、准备资源3.调用对应的方法来处理请求4.销毁Servlet对象在ServletAPI中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。该类有以下方法init(ServletConfigconfig)service(ServletRequestreq,ServletResponseres)destroy()HttpServlet是Servlet这个接口的一个抽象的实现类,它对Servlet接口中的部分方法(init和destroy)添加了实现,使得开发时只需要考虑针对service方法的业务实现即可。开发时我们一般继承HttpServlet类并实现service方法init(ServletConfigconfig)方法由tomcat自动调用,它读取web工程下的web.xml,并将接收的信息传递给GenericServlet类中的成员变量config,同时调用init()。Init()方法只执行一次,常用来获取初始化参数ServletContextWeb容器在启动时会为每一个web应用程序创建一个对应的ServletContext对象(该对象就是Servlet上下文),它代表当前web应用,是一个全局环境变量,该应用中的任何组件都可以访问该对象.获取该对象的方式有以下四种GenericeServlet(HttpServlet)提供的getServletContext()ServletConfig提供的getServletContext()HttpSession提供的getServletContext()FilterConfig提供的getServletContext()Servlet上下文的作用在Web应用范围内存取共享数据:如setAttribute(),getAttribute()访问Web应用的静态资源:如getRealPath(Stringpath)线程安全问题容器收到请求后会启动一个线程进行处理,默认情况下浏览器只会为每个Servlet创建一个实例,如果同时有多个请求访问同一个Servlet,则肯定会有多个线程访问同一个实例,如果这些线程要修改Servlet实例的某个属性就有可能发生线程安全问题.如何保证Servlet线程安全使用synchronized对代码加锁即可。JSP作为简化Servlet开发的一种技术,是Sun公司制定的一种服务器端动态页面技术的组件规范,能够将Servlet中用于表现的功能分离出来,提高视图的开发效率。如何编写JSP1、创建一个以“jsp”为后缀的文件2、在文件中添加用于控制页面显示的HTML代码、样式及JavaScript脚本。3、在需要动态生成的部分添加Java代码的编程逻辑JSP页面中的注释1、!--注释内容--2、%--注释内容--第一种注释也叫HTML注释,可以出现在JSP页面之中,注释内容中可以包含了一些Java代码,但这些代码会被执行第二行注释是JSP注释,不允许注释的内容出现Java代码,写了Java代码也会被忽略,不会执行。JSP页面中的指令常用指令有三种:page指令、include指令、taglib指令page指令可以实现在JSP页面中导入要用到的Java包,设置输出内容的编码方式,include指令主要用于将其他页面包含在另一个页面之中,可以实现页面内容的重用。转发一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续完成,这个转交的过程叫做转发。常见情况是Servlet负责获取数据,然后将数据转交给JSP进行展现。实现转发过程可遵循以下三个步骤:步骤一、绑定数据到request对象request.setAttribute(Stringname,Objectobj);步骤二、获得转发器RequestDispatcherrd=request.getRequestDispatcher(Stringuri);步骤三、实现转发rd.forward(request,response);其中步骤二和步骤三可以合并为一行代码:request.getRequestDispatcher(String,uri).forward(req,res);重定向和转发的区别重定向:浏览器发送请求到容器访问A,A可以发送一个状态码302和一个Location消息头到浏览器,于是浏览器会立即向Location发新的请求。转发:浏览器发送请求到容器访问A,A可以通知容器去调用B。转发所涉及的各个Web组件会共享同一个request和response对象;而重定向不行。在JSP页面或Servlet中需要从一个组件到另一个组件的跳转,通常以链接、表单提交、重定向、转发的形式来完成,其中对目标位置的标识即路径。链接地址ahref=”url”链接文本/a表单提交formaction=”url”重定向response.sendRedirect(url);转发request.getRequestDispatcher(url);重定向和转发的区别:转发:1.一次请求;2.地址不变;3.两个组件共用一个request(可以共享数据);4.不能转发到外部资源重定向:1.两次请求;2.地址改变;3.两个组件共用两个request(不能共享数据);4.可以重定向到外部资源相对路径相对路径指的是相对于当前位置,为了到达目标文件要经过的路径。书写格式上不以“/“开头,如果为了退至上一级目录可以”../“开头。绝对路径绝对路径指的是,不管当前文档所在的位置在哪里,都会从一个固定的点出发,然后构建到达目标文件所需要经过的路径。通常绝对路径在书写格式上以“/”开头。异常处理一般有两种方式来处理异常,编程式的异常处理和声明式的处理。编程式的异常处理就是在程序中捕获到异常时,使用转发跳转到指定页面进行提示说明。声明式的处理主要依靠容器自己来完成,即产生异常时抛出给容器,但不能让容器将这些底层信息返回给客户端,所以需要在web.xml文件中添加配置说明,通知容器在捕获到异常时应该将什么样的页面返回给客户端。一旦使用声明式处理方式,则该项目下的任意一个文件错误或异常,都会跳到指定的错误处理页面。EL表达式使用EL表达式可以非常明显的简化输出系统定义的对象的属性过程。EL表达式的作用有三种:访问bean属性、输出简单计算结果、获取请求参数值。Bean:指的是一个公共的类,按照固定的方式提供属性的get/set访问方式。使用EL表达式访问Bean属性方式一:${对象名.属性名}${user.name}执行的过程为:从pageContext、request、session、application中依次查找绑定名为“user”的对象,找到后调用“getName”方法,将返回值输出。方式二:${对象名[“属性名”]}${user[“name”]}在书写表达式时,如果没有指定搜索范围,那么系统会依次调用pageContext、request、session、application的getAttribute()方法。这样不限定查找范围的代码不利于排错,所以这种取值的操作可以限定对象的查找范围。如:${sessionScope.user.name}一旦指定了对象所在的范围,那么只会在范围内查找绑定对象,不会在找不到的时候再去其他区域中查找了。sessionScope的位置还可以填写pageScope、requestScope、applicationScope。使用EL表达式进行计算EL表达式可以单独进行运算得出结果并直接输出,EL可进行算术运算,逻辑运算,关系运算,及empty运算。使用EL表达式获取请求参数值以下两种写法分别等价:${param.username}与request.getParameter(“username”);${paramValues.city}与request.getParameterValues(city);内置对象JSTL标签如何使用JSTL将标签库对应的jar包拷贝到WEB-INF/lib目录下,以便于系统可以加载所需要的类。使用taglib指令在页面上引入标签的命名空间和前缀,帮助系统定位对应的类。如:%@tagliburi=