- How to develop servlets?
- 前言:
- 如何给Servlet映射一个地址?
- 如何请求一个Servlet?
- 1.通过HTTP GET请求Servlet
- 2.通过HTTP POST请求Servlet
- GET与POST的使用场景:
- Servlet的一些常用方法
- 如何获取客户端传递的参数?
- 如何存取Attribute(属性)?
- 如何将request对象转发?
- 请求转发:
- 重定向:
- 怎样配置web.xml?
- Servlet的基本工作原理
How to develop servlets? 前言:
首先给出一个实现用户注册功能的Servlet示例:
package com.example.demoboard; import com.example.demoboard.JavaBean.UserBean; import com.example.demoboard.useBean.UserDB; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "registerServlet", value = "/register-servlet") public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); System.out.println("ta点了注册!"); String username = request.getParameter("username"); String password = request.getParameter("password_1"); UserBean user = new UserBean(username, password); UserDB.insert(user); } }
UserDB.insert(user);这一段是关于数据库的内容,暂且不管。
其中doGet(),doPost()是继承了HttpServlet以后需要我们自己实现的方法,request,response是常用的两个对象,除此之外HttpServlet自带的一些方法可以通过this.func()的方式调用。具体内容下面会逐一给出。
如何给Servlet映射一个地址?
How to create and map a servlet?
浏览器是不能直接访问Servlet的,需要通过映射的方式间接访问Servlet。同时一个Web项目通常会有多个Servlet供Tomcat调用,那么如何创建Servlet的对应关系呢?我们需要先给Servlet配置一个地址,通过这个地址再来访问Servlet。映射的配置方式有两种:1.注解,2.修改web.xml。
-
通过注解(map a servlet with an annotation)
package com.example.webstudy; import java.io.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println(""); out.println("" + message + ""); out.println(""); } public void destroy() { } }
这是IDEA在创建Web项目时为我们准备的例子,其中@WebServlet(name = "helloServlet", value = "/hello-servlet") 即为配置Servlet映射的注解,Servlet的名字为helloServlet,与它对应的地址是/hello-servlet 。
*tips:*注解也可以写成@webServlet("/hello-servlet")跟上面是一样的效果。
-
修改web.xml文件(map a servlet with the web.xml file)
helloServlet com.example.webstudy helloServlet /hello-servlet 通过修改xml文件的方式需要指定Servlet所在的包名(package),
com.example.webstudy ,中填写要给Servlet映射的地址。
如何请求一个Servlet?
How to request a servlet?
给Servlet配置了地址以后,我们有两种方式请求Servlet:
- HTTP GET request
- HTTP POST request
HttpServlet在接收到客户端发来的请求以后,会根据请求的方式将其转交给对应的方法来处理。GET请求交给doGet()方法,POST请求交给doPost()方法。
1.通过HTTP GET请求ServletHow to use the HTTP GET method?
可以简单理解为在客户端通过url请求Servlet,并传递参数,这种统称为GET方式。
比如我可以直接在浏览器中输入url:http://localhost:8080/webstudy_war_exploded/hello-servlet?user=admin ,可以直接访问到/hello-servlet所对应的Servlet,同时将?后面的内容以键值对(key-value)的形式传给Servlet中的doGet()方法。
-
如何在url后面添加一些参数?
How to append parameters to a URL?
一个参数:/hello-servlet?name=admin
多个参数:/hello-servlet?name=admin&password=123456
-
如何以GET方式请求Servlet并传递参数?
How to append parameters to a GET request?
-
在浏览器地址栏中输入URL
Enter the URL into the browser’s address bar
http://localhost:8080/webstudy_war_exploded/hello-servlet?user=admin&password=123456
-
HTML中的表单,将method属性设置为get
Code a form that uses the GET method
-
在超链接中
Code an anchor tag
goto helloServlet
-
How to use the HTTP POST method?
POST请求可以在Form表单中定义,与GET方式的区别是GET请求会把传递的参数展示在浏览器的地址栏中,而POST不会,相比之下POST方式更加安全。
-
HTML中的表单,将method属性设置为post
A Form tag that uses the POST method
Servlet的一些常用方法
Skills for working with servlets
在实际的Web开发中我们不需要自己实现Servlet,而是继承HttpServlet,它帮我们实现了Servlet并屏蔽了一些不常用的方法,我们只需要完成其中的doGet()与doPost()方法即可。
其中request对象与response是HttpServletRequest与HttpServletResponse的对象,它们是最常用的两个对象,里面有很多常用的方法。为了使用它们,我们在实现doGet(),doPost()方法时要将它们作为参数传给这两个方法。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { ... }
- request对象:获取客户端数据。
- response对象:响应客户端数据,向客户端发送数据。
How to get the values of the parameters?
我们通过GET或者POST方式请求了Servlet并传递了key-value型的数据,那么如何得到它呢?
-
一个key对应一个value时:
假设以GET方式请求Servlet:http://localhost:8080/webstudy/hello-servlet?user=admin。
String username = request.getParameter("user");
-
一个key对应多个value时(比如一个多选的Form表单):
假设在HTML页面中定义一个复选框,以POST方式请求Servlet。
在demo-servlet,可以通过下面的方法获取一组值。
String[] fruits = request.getParameterValues("Fruit");
How to get and set request attributes?
Attribute是服务器端的组件,当我们想要保存某个对象的时候可以使用setAttribute()方法,将其保存在request对象中,取得已保存的对象可以使用getAttribute()方法。
-
以key-value的形式存取对象。
User user = new User(username, password); request.setAttribute("user1", user);
// 返回的是Object类,需要cast User user = (User) request.getAttribute("user1");
-
setAttribute()只能保存对象,如果要保存基本类型的数据,应该使用它们的包装类。
int id = 1; request.setAttribute("id", new Interger(id));
// 同样需要cast,同时Interger会自动拆箱,将数值赋值给id int id = (Interger) requset.getAttribute("id");
How to forward requsets?
请求转发:我们已经在request里存了一些对象,如何在其他地方得到它们呢?
可以使用转发的方式,将request转发到其他地方。
-
转发给网页
String url = "/demo.jsp"; request.getServletContext.getRequestDispatcher(url).forward(request, response);
-
转发给其他Servlet
String url = "/webstudy/hello-servlet"; request.getServletContext.getRequestDispatcher(url);
重定向仅仅会使浏览器跳转到其他地方,而不会将request对象转发,属于response对象的方法。
-
重定向到其他Servlet
response.sendRedirect("/hello-servlet");
-
重定向值某个网页
response.sendRedirect("/demo.jsp");
怎样配置web.xml?
How to work with the web.xml file?
前文提到通过修改web.xml的方式可以配置Servlet的映射地址,除此之外,你还可以:
-
配置初始参数(key-value)
-
对所有Servlet生效
username Zhang san 在Servlet中取得初始参数:
// 对全局生效,使用ServletContext String username = this.getServletContext().getInitParameter("username");
-
对特定的Servlet生效
HelloServlet com.webstudy.HelloServlet username Zhang san 在Servlet中取得初始参数:
// 对特定servlet生效,使用ServletConfig String username = this.getServletConfig().getInitParameter("username");
-
-
设置欢迎页(默认主页,会从配置的第一个页面开始寻找)
Demo.html index.jsp -
设置错误页面
404 /error_404.html
Servlet的基本工作原理
How the method of a servlet work?
-
HttpServlet
在编写Servlet应用程序时,大多数都要用到HTTP,也就是说可以利用HTTP提供的特性,javax.servlet.http包含了编写Servlet应用程序的类和接口,其中很多覆盖了javax.servlet中的类型,我们自己在编写应用时大多时候也是继承的HttpServlet。
当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。
针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。
(来源:简书-理解Servlet工作原理 - 简书 )
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)