Servlet 是处理动态web的一门技术,可以用来接收和响应来自客户端的请求。Servlet 接口两个默认的实现类:HttpServlet,GenericServlet。
一、简单的应用
一般编写Servlet都是直接继承并重写HttpServlet的 doGet 和 doPost 方法。
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello,Servlet");
}
}
然后在web.xml 中进行响应的注册
<!-- 注册 servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>online.zzkweb.servlet.HelloServlet</servlet-class>
</servlet>
<!-- Servlet 的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
配置好Tomcat后便可以在浏览器看到
同时控制台也可以看到
为了避免输出乱码,可以设置接收和响应的编码格式
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
当然看到这里很容易让人误解:servlet 只能作用于当前的请求。
既然我都怎么说了,那自然不是这样。
二、ServletContext
ServletContext 即servlet 上下文,作用于整个项目。我们可以通过 setAttribute 和 getAttribute 来存放和获取数据,以键值对的形式:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "日常瞎折腾";
// 数据将保存在 ServletContext。 键值对。
context.setAttribute("username",username);
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username"); //值为:日常瞎折腾
}
当然,前提是得先放然后才能去得到,不然只能是null。
三、重定向和转发
这两个在网站的应用中,也是经常有的。重定向最简单的就是登录后跳转以及防止表单重复提交等等,转发相较于重定向它少了一次请求速度较快,而且遇到一些数据未处理完的情况就可以用转发。
resp.sendRedirect("http://blog.zzkweb.online/"); // 重定向
重定向会跳转到 http://blog.zzkweb.online
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/hello").forward(req,resp);// 转发
转发 “/hello” 即文章开头的 Hello,Servlet
关于重定向和转发,他们的页面都会实现跳转,不同在于重定向url会变化【302】,转发url不会变化【307】,以及转发请求的次数比重定向少,重定向可以防止表单重复提交等等…
四、获取前端传递的值
获取也比较简单
String name = req.getParameter("name"); // string
String[] hobby = req.getParameterValues("hobby"); // 多选框
获取后可以通过输出查看
System.out.println(name);
System.out.println(Arrays.toString(hobby));
当然,hobby 也可以通过遍历来输出
五、其他
除了以上的还有比如:doPut 、doDelete、service 、getServletName、getInitParameter 等等 …