Servlet获取前端提交的参数
学好Servlet必须紧紧围绕着请求和响应这两个概念
以上写的代码只是进行请求,然后再响应到客户端。请求的时候没有带数据给Servlet
下面开始写在请求的时候前端带数据到servlet里面,我们servlet要接收前端给我们的这个数据
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="login" method="post"> <input type="text" name="username"/><br> <input type="text" name="password"/><br> <input type="submit" value="提交"> </form> </body> </html>
- servlet实例
public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //html页面中 input标签发送的数据,都会存到HttpServlet这个对象里面 //通过前端input标签name的属性值获取前端发送的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username: " + username+"===password"+password); //Servlet响应数据到客户端的时候,如果是中文的话,会乱码 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("username: " + username+"===password"+password); } }
- web.xml
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.by.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
中文乱码的解决方案
请求时候的乱码问题:
//前端发送数据到Servlet,如果是post请求的话,input输入中文数据的时候,Servlet接到的数据是乱码的。 request.setCharacterEncoding("utf-8");
响应时候中文乱码的问题:
//Servlet响应数据到客户端的时候,如果是中文的话,会乱码 response.setContentType("text/html;charset=utf-8");
重定向和转发
web网站上面有一些跳转按钮。比如登录成功以后跳转到主页面!!!
重定向
- 是什么
用户通过浏览器发送一个请求,Tomcat服务器接收这个请求,会给浏览器发送一个状态码302,并设置一个重定向的路径,浏览器如果接收到了这个302的状态码以后,就会去自动加载服务器设置的路径
一个页面跳转到另外一个页面(应用场景)、登录页面跳转到主页面:
login.jsp====>LoginServlet====>main.jsp
- 特征:
①重定向的过程是浏览器(客户端)的行为
②实际上浏览器做了2次请求(当点击登录按钮的时候做了两次请求)(分别是请求login和main.jsp)
③注意上一次请求的request对象会丢失
④重定向有一个非常明显的特征,即浏览器的url变化了
- 重定向就一句核心代码:
response.sendRedirect("main.jsp"); //就这一行代码,但是这一行代码必须写在doGet或者doPost方法中
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--请求RedirectServlet--%> <form action="redirect" method="post"> <input type="text" name="username"/><br> <input type="text" name="password"/><br> <input type="submit" value="提交"> </form> </body> </html>
- RedirectServlet
package com.by.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RedirectServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置字符编码 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); request.setAttribute("username", username); request.setAttribute("password", password); //登录以后跳转到主页 //重定向 //这个TestLoginServlet里面的数据是不能传给target.html的 response.sendRedirect("main.jsp"); } }
- web.xml
<servlet> <servlet-name>redirect</servlet-name> <servlet-class>com.by.servlet.RedirectServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>redirect</servlet-name> <url-pattern>/redirect</url-pattern> </servlet-mapping>
- main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 这是main页面<br> <%-- <%=request.getAttribute("username")%> <%=request.getAttribute("password")%> --%> ${username} ${password} </body> </html>
- 测试
转发
- 是什么
用户发送数据请求到服务器,服务器接收当前请求,会调用内部方式(转发)处理该请求,最终把响应给客户端
- 特征:
①转发是服务器的行为
②浏览器在这个过程中只有一次行为
③转发可以带有数据 request对象中
④url不会发生任何的变化
- 核心代码也只有一行
request.getRequestDispatcher(“main.jsp”).forward(request,response); //这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--请求ForwardServlet--%> <form action="forward" method="post"> <input type="text" name="username"/><br> <input type="text" name="password"/><br> <input type="submit" value="提交"> </form> </body> </html>
- ForwardServlet
package com.by.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ForwardServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置字符编码 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); request.setAttribute("username", username); request.setAttribute("password", password); //登录以后跳转到主页 //重定向 //这个TestLoginServlet里面的数据是不能传给target.html的 request.getRequestDispatcher("main.jsp").forward(request, response); } }
- web.xml
<servlet> <servlet-name>forward</servlet-name> <servlet-class>com.by.servlet.ForwardServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>forward</servlet-name> <url-pattern>/forward</url-pattern> </servlet-mapping>
- main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 这是main页面<br> ${username} ${password} </body> </html>
- 测试
Servlet的自动加载
默认情况下,第一次访问servlet的时候,创建servlet对象。如果servlet构造函数里面的代码或者init方法里面的代码比较多,就会导致用户第一次访问servlet的时候比较慢。这个时候,我们可以改变servlet对象的创建时机:提前到加载web应用的时候。在servlet的配置信息中,加上一个
<servlet> <servlet-name>loadOnStartup</servlet-name> <servlet-class>com.by.servlet.LoadOnStartupServlet</servlet-class> <!--容器是否在启动时加载该servlet,数字越小优先级越高越高--> <load-on-startup>1</load-on-startup> </servlet>
servlet实例:
public class LoadOnStartupServlet implements HttpServlet { public LoadOnStartupServlet(){ System.out.println("LoadOnStartupServlet constructor method has run...."); } }
这样配置之后,servlet的构造函数和init方法就会在web应用加载的时候就会执行。