文章目录
解决乱码问题
Request
Cookie
Session
解决乱码问题
所有能设置编码的地方都统一设置 : 数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。
Request
获取属性:使用Request对象,可以获取到web项目的相关属性,代码如下:
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 RequestDemo01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //查看request对象的方式 System.out.println(request.getContextPath()); //获得web项目路径 System.out.println(request.getRequestURI()); //请求的URL路径 //Remote 远程 System.out.println(request.getRemoteUser()); //获得远程的用户名 System.out.println(request.getRequestedSessionId()); //获得SessionId; System.out.println(request.getServletPath()); //请求servlet的url System.out.println(request.getLocalAddr()); //获得本地地址 防火墙 System.out.println(request.getLocalName()); //获得本地名字 System.out.println(request.getLocalPort()); //获得访问的端口号 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
接收前端用户提交的参数:通过Request对象,可以获取到用户从前端提交的数据,步骤如下:
1、编写前端注册jsp页面
表单提交的方式:get/post(推荐)
表单提交的位置action:服务项目的路径/servlet对应的请求url
JSP中,获取项目路径的语法为:${pageContext.request.contextPath}
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>注册</title> </head> <body> <%-- JSP的注释 --%> <%-- Form表单 action:代表要提交的路径,表单要提交到哪里 ,可以提交到一个Servlet //提交到Servlet需要,获取到Web项目的路径下的Servlet method: 提交表单的方式 --%> <h1>注册</h1> <form action="${pageContext.request.contextPath}/r2" method="post"> <p>用户名:<input type="text" name="username"></p> <p>密码:<input type="password" name="password"></p> <p> <input type="submit"> <input type="reset"> </p> </form> </body> </html>
/
2、写处理前端提交信息的Servlet
接收前端传递的控件信息,利用request.getParameter("控件的name")来实现
import javax.print.attribute.HashPrintRequestAttributeSet; 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 RequestDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //通过HttpServletRequest获取前端用户提交的信息 //req.getParameterValues(); 获得前端传递的控件信息,通过控件的name;但是可以接受多个参数的控件,比如(多选框....) //req.getParameter(); 获得前端传递的控件信息,通过控件的name; req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); //连接数据库,比较数据库中的信息是否匹配 if (username.equals("admin")&&password.equals("1234567")){ System.out.println("登录成功!"); //跳转到成功页面 }else { System.out.println("登录失败!"); //提示重新注册 } System.out.println(username); System.out.println(password); } }
3、配置web.xml
<servlet> <servlet-name>RequsetDemo02</servlet-name> <servlet-class>servlet.RequestDemo02</servlet-class> </servlet> <!--=====================================================--> <servlet-mapping> <servlet-name>RequsetDemo02</servlet-name> <url-pattern>/r2</url-pattern> </servlet-mapping>
4、提交测试
- 检查英文提交情况,服务器是否能接受成功
- 提交中文,查看乱码情况
- 设置编码统一,解决乱码问题
Request实现请求转发:通过Request对象,可以实现请求转发,代码如下:
import javax.servlet.RequestDispatcher; 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 FormServlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //处理乱码 req.setCharacterEncoding("UTF-8"); //处理前端的请求 String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("接收到的用户名:"+username+"\n密码:"+password+"\n爱好:"); String[] hobbies = req.getParameterValues("hobby"); for (String hobby : hobbies) { System.out.println(hobby); } //重定向:服务器告诉客户端你应该请求另外一个地址; (地址栏会变) //resp.sendRedirect("url"); //转发:服务器把这个请求转向另外一个Servlet去处理; (地址栏不会变) //RequestDispatcher ,需要使用RequestDispatcher来进行处理,我们需要获得这个类 //参数就是他要转发到的页面 /* RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp"); requestDispatcher.forward(req,resp); */ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } req.getRequestDispatcher("/success.jsp").forward(req,resp); } }
既然提到了转发,就不得不提到转发和重定向的区别,它们的区别如下:
重定向:服务器告诉客户端,去请求另外一个地址(客户端行为)
- 地址栏会变
- 不能携带参数
转发:服务器自己转发到服务器上的另一个请求(服务器行为)
- 地址栏不会变
- 可以携带参数
Javaweb中针对客户端/服务端这两个不同的端,诞生了两个小机制
cookie :在客户端留下一点东西,客户端下次带过来,我就知道你来过了。
- 问:我的店铺非常大,怎么证明你来过?
- 答:你开一个会员吧 , 我给你一张VIP卡,你下次带卡来,我就知道你来过了
Session:在服务器端登记你来过。
- 问:你去理发店。怎么证明你来过?
- 答:理发店收会员,在他的笔记本上记录了你的消息,下次你来直接报上大名就可以了。
Cookie
构造器:
Cookie cookie = new Cookie(String name,String value); Cookie cookie = new Cookie(String name,String value); Cookie cookie = new Cookie(String name,String value);
服务器响应cookie给客户端:
Response.addCookie(Cookie); Response.addCookie(Cookie); Response.addCookie(Cookie);
服务查看用户带来的请求是否有cookie:
Cookie[] cookies = Request.getCookie(); //可以使用cookie来验证用户是否来过 //判断cookies是否为空,然后遍历即可 Cookie.getName(); Cookie.getValue();
cookie测试用户是否来过
import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CookieTest extends HttpServlet { boolean flag = false; 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"); response.setCharacterEncoding("UTF-8"); //检查请求的人是否带了Cookie //通过用户的请求,检查它是否有cookie Cookie[] cookies = request.getCookies(); System.out.println("cookie:"+cookies); if (flag){//如果flag是真,来过 if (cookies!=null){//你有cookie for (int i = 0; i < cookies.length ; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("lastLoginTime")){ response.getWriter().println("你上一次来的时间为:"+cookie.getValue()); System.out.println("刷新了cookie"); } } } }else { //如果flag是真,没来过 response.getWriter().println("你是第一次来,还想要会员套餐"); System.out.println("给该用户一个cookie"); } //建立一个cookie Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+""); //设置cookie保存的时间 //cookie.setMaxAge(); //把这个cookie发给客户端 response.addCookie(cookie); //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+"")); flag = true; } }
Session
只要客户端一旦连接上服务器,服务器就会自动产生Session;
一个连接对应一个session,session可以在一个会话中传递信息;
通过setAttribute设置值。
通过getAttribute获得值。
由服务器端控制,服务器如果重启了,信息就会丢失!
假设从第一个网页将一个键值对存入到session后,到第二个网页后再从session取出来,示例代码如下:
1、第一个Servlet(将值存入session)
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; public class SessionTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题: req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); //Session由服务器自动创建,如何获得session //HttpSession 得到的sessioin对象 HttpSession session = req.getSession(); //得到sessionID,一次会话,一个seesionID; String id = session.getId(); resp.getWriter().println("获得的sessionId:\n"+id); String name = "qinjiang"; //向session中存入一个值; session.setAttribute("name",name); resp.getWriter().println("存入信息成功:"+name); } }
2、第二个Servlet(从session取出值)
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; //获得session存入的值 public class SessionTest2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题: req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); //获得 HttpSession session = req.getSession(); System.out.println("得到的SessionID:"+session.getId()); String name = (String) session.getAttribute("name"); resp.getWriter().println("得到的session存入的信息"+name); //Servlet < Seesion < WebContext } }
若想要让session失效,就需要让会话注销,方法如下:
会话注销方法一:
session.invalidate();//通过代码注销会话
会话注销方法二:
<!--session-config可以设置会话自动过期,时间分钟为单位--> <session-config> <session-timeout>1</session-timeout> </session-config>