1.@WebServlet注解的作用
在Servlet 3.0中,使用@WebServlet注解可实现servlet和url的映射,它告知容器哪些Servlet会提供服务以及额外信息,其作用相当于之前在web.xml中设置的servlet配置。
以下两种方法二选一:
a.一种使用注解
1 @WebServlet{helloUser} 2 public class helloUser extends HttpServlet{ 3 }
只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息。上面的@WebServlet告诉容器,如果请求的URL是“/helloUser”,则由helloUser的实例提供服务。
可以使用@WebServlet提供更多信息。
1 @WebServlet( 2 name="Hello", 3 urlPatterns={"/hello.view"}, 4 loadOnStartup=1 5 ) 6 public class HelloServlet extends HttpServlet {
上面的@WebServlet告知容器,HelloServlet这个Servlet的名称是Hello,这是由name属性指定的,而如果客户端请求的URL是/hello.view,则由具Hello名称的Servlet来处理,这是由urlPatterns属性来指定的。在Java EE相关应用程序中使用标注时,可以记得的是,没有设置的属性通常会有默认值。例如,若没有设置@WebServlet的name属性,默认值会是Servlet的类完整名称。
当应用程序启动后,事实上并没有创建所有的Servlet实例。容器会在首次请求需要某个Servlet服务时,才将对应的Servlet类实例化、进行初始化操作,然后再处理请求。这意味着第一次请求该Servlet的客户端,必须等待Servlet类实例化、进行初始动作所必须花费的时间,才真正得到请求的处理。
如果希望应用程序启动时,就先将Servlet类载入、实例化并做好初始化动作,则可以使用loadOnStartup设置。设置大于0的值(默认值为-1),表示启动应用程序后就要初始化Servlet(而不是实例化几个Servlet)。数字代表了Servlet的初始顺序,容器必须保证有较小数字的Servlet先初始化,在使用标注的情况下,如果有多个Servlet在设置loadOnStartup时使用了相同的数字,则容器实现厂商可以自行决定要如何载入哪个Servlet。
b.使用web.xml配置方式
1 <servlet> 2 <servlet-name>helloUser</servlet-name> 3 <servlet-class>com.servlet.HelloUser</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>helloUser</servlet-name> 7 <url-pattern>/helloUser</url-pattern> 8 </servlet-mapping>
2.多个请求访问同一个servlet
在我们刚开始编写java web程序时,可能会一个jsp页面功能对应一个服务器的servlet。例如对我们的客户表(Customer)实行增删改查时,每个操作对一个servlet。这样的话,不仅使得代码量很大,而且会使得代码不好管理。那我们想到的是,怎么实现JSP页面的多个请求对应一个servlet呢?通过一个servlet完成增删改查等多个功能呢?
例如我的jsp页面中查询数据库中的表customer时,展现的如下图所示
我们需要实现的是在输入框中输入要查找的名字或者地址或者电话时,可以实现模糊查询,点击submit时,可以在当前页面下面显示查询的数据结果,例如输入数据库中有的用户名rose
再点击submit,页面呈现
当点击upadate和Delete,可是实现对用户的信息修改和删除功能。在我们刚开始的学习中,会将这些功能都分别对应一个servlet,现在实现的就是这些功能都对应一个servlet。
第一:我们可以在jsp页面中对from中的action统一格式为,都以.do结尾。
1 <form action="query.do" method="post"> 2 <td><a href="addCustomer.jsp">Add a new customer</a></td> 3 <td><a href="edit.do?id=<%=customer.getId() %>">Update</a></td> 4 <td><a href="delete.do?id=<%=customer.getId() %>">Delete</a></td> 5 </form>
那么在我们的一个名为CustomerServlet的web.xml配置文件中可以改写为
1 <servlet> 2 <servlet-name>CustomerServlet</servlet-name> 3 <servlet-class>com.servlet.CustomerServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>CustomerServlet</servlet-name> 7 <url-pattern>/CustomerServlet</url-pattern> 8 </servlet-mapping>
那么只要页面中以.do结尾的action在提交后,都会去寻找CustomerServlet。那么我们在CustomerServlet中怎么辨别每一个不同的action呢?我们的做法如下:我们在CustomerServlet中的doGet方法中实现
1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //获取servletpath 3 String servletPath = request.getServletPath(); 4 //去除路径后缀名中的.do 5 String methodName = servletPath.substring(1); 6 methodName = methodName.substring(0, methodName.length()-3); 7 8 try { 9 //利用反射获取methodName 对应的方法 10 Method method = getClass().getDeclaredMethod(methodName, 11 HttpServletRequest.class, 12 HttpServletResponse.class); 13 //利用反射调用相应的方法 14 method.invoke(this, request, response); 15 } catch (Exception e) { 17 response.sendRedirect("error.jsp"); 18 } 19 }
这样实现可以根据页面的不同请求,截掉.do,得到不同请求名。但注意的是必须页面中的请求名和seevlet中各实现功能的方法名相同。如页面中是delete.do,那么我们的servlet中的方法名就应该写成delete,这样才能该请求获取相应的功能。
https://my.oschina.net/zjllovecode/blog/961994
https://blog.csdn.net/congmingpig_htt/article/details/50492339