企業(yè)網(wǎng)站建設(shè)網(wǎng)站優(yōu)化百度官方認(rèn)證
文章目錄
- 一、Java web技術(shù)棧
- 二、Http
- 1.1 Http請求數(shù)據(jù)格式
- 1.2 Http響應(yīng)數(shù)據(jù)格式
- 1.3 狀態(tài)碼
- 二、Tomcat
- 2.1 介紹
- 2.2 web項目結(jié)構(gòu)
- 2.3 IDEA中使用Tomcat
- 三、Servlet
- 3.1 Servlet使用
- 3.2 Servlet生命周期
- 3.3 Servlet方法和體系結(jié)構(gòu)
- 3.4 urlPattern配置
- 四、Request
- 4.1 獲取請求數(shù)據(jù)
- 4.2 通用方式獲取請求參數(shù)
- 4.3 請求參數(shù)中文亂碼問題
- 4.4 請求轉(zhuǎn)發(fā)
- 五、Response
- 5.1 設(shè)置響應(yīng)數(shù)據(jù)
- 5.2 重定向【注意:與請求轉(zhuǎn)發(fā)區(qū)別】
- 5.3 響應(yīng) 字符 / 字節(jié) 數(shù)據(jù)
- 五、項目小實戰(zhàn)【用戶登錄注冊】
一、Java web技術(shù)棧
二、Http
1.1 Http請求數(shù)據(jù)格式
1.2 Http響應(yīng)數(shù)據(jù)格式
1.3 狀態(tài)碼
二、Tomcat
2.1 介紹
官網(wǎng):https://tomcat.apache.org/
2.2 web項目結(jié)構(gòu)
2.3 IDEA中使用Tomcat
方式一:
方式二:
三、Servlet
3.1 Servlet使用
3.2 Servlet生命周期
3.3 Servlet方法和體系結(jié)構(gòu)
3.4 urlPattern配置
四、Request
request接受來自瀏覽器的請求數(shù)據(jù)
4.1 獲取請求數(shù)據(jù)
package com.bhy.web.request;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;/*** request 獲取請求數(shù)據(jù)*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getMethod():獲取請求方式: GETString method = req.getMethod();System.out.println(method);//GET// String getContextPath():獲取虛擬目錄(項目訪問路徑):/request-demoString contextPath = req.getContextPath();System.out.println(contextPath);// StringBuffer getRequestURL(): 獲取URL(統(tǒng)一資源定位符):http://localhost:8080/request-demo/req1StringBuffer url = req.getRequestURL();System.out.println(url.toString());// String getRequestURI():獲取URI(統(tǒng)一資源標(biāo)識符): /request-demo/req1String uri = req.getRequestURI();System.out.println(uri);// String getQueryString():獲取請求參數(shù)(GET方式): username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);//------------// 獲取請求頭:user-agent: 瀏覽器的版本信息String agent = req.getHeader("user-agent");System.out.println(agent);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取post 請求體:請求參數(shù)//1. 獲取字符輸入流BufferedReader br = req.getReader();//2. 讀取數(shù)據(jù)String line = br.readLine();System.out.println(line);}
}
4.2 通用方式獲取請求參數(shù)
package com.bhy.web.request;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Map;/*** request 通用方式獲取請求參數(shù)*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 獲取所有參數(shù)的Map集合Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {// username:zhangsan lisiSystem.out.print(key+":");//獲取值String[] values = map.get(key);for (String value : values) {System.out.print(value + " ");}System.out.println();}System.out.println("------------");//2. 根據(jù)key獲取參數(shù)值,數(shù)組String[] hobbies = req.getParameterValues("hobby");for (String hobby : hobbies) {System.out.println(hobby);}//3. 根據(jù)key 獲取單個參數(shù)值String username = req.getParameter("username");String password = req.getParameter("password");System.out.println(username);System.out.println(password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//POST請求邏輯this.doGet(req,resp);}
}
4.3 請求參數(shù)中文亂碼問題
package com.bhy.web.request;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 中文亂碼問題解決方案*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 解決亂碼:// 1.POST方式,getReader()// 解決方法:request.setCharacterEncoding("UTF-8");//設(shè)置字符輸入流的編碼//3. GET方式,獲取參數(shù)的方式:getQueryString// 亂碼原因:tomcat進(jìn)行URL解碼,默認(rèn)的字符集ISO-8859-1//獲取usernameString username = request.getParameter("username");System.out.println("解決亂碼前:"+username);/*//3.1 先對亂碼數(shù)據(jù)進(jìn)行編碼:轉(zhuǎn)為字節(jié)數(shù)組byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);//3.2 字節(jié)數(shù)組解碼username = new String(bytes, StandardCharsets.UTF_8);*/username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);System.out.println("解決亂碼后:"+username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
4.4 請求轉(zhuǎn)發(fā)
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5...");System.out.println(request);//存儲數(shù)據(jù)request.setAttribute("msg","hello");//請求轉(zhuǎn)發(fā)request.getRequestDispatcher("/req6").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}@WebServlet("/req6")
public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo6...");System.out.println(request);//獲取數(shù)據(jù)Object msg = request.getAttribute("msg");System.out.println(msg);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
五、Response
Response設(shè)置響應(yīng)數(shù)據(jù)
5.1 設(shè)置響應(yīng)數(shù)據(jù)
5.2 重定向【注意:與請求轉(zhuǎn)發(fā)區(qū)別】
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("resp1....");//重定向/*//1.設(shè)置響應(yīng)狀態(tài)碼 302response.setStatus(302);//2. 設(shè)置響應(yīng)頭 Locationresponse.setHeader("Location","/resp2");*///簡化方式完成重定向//動態(tài)獲取虛擬目錄String contextPath = request.getContextPath();response.sendRedirect(contextPath+"/resp2");//response.sendRedirect("https://www.itcast.cn");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
注意:虛擬目錄問題,一般來說服務(wù)器使用(不需要加上虛擬目錄),瀏覽器使用(需要加上虛擬目錄)
5.3 響應(yīng) 字符 / 字節(jié) 數(shù)據(jù)
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 設(shè)置瀏覽器要解析html代碼和字符集(解決亂碼)response.setContentType("text/html;charset=utf-8");//1. 獲取字符輸出流PrintWriter writer = response.getWriter();//設(shè)置content-type目的,告訴瀏覽器解析HTML代碼,例如下面的<h1></h1>//response.setHeader("content-type","text/html");writer.write("你好");writer.write("<h1>aaa</h1>");//細(xì)節(jié):流不需要關(guān)閉}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 讀取文件FileInputStream fis = new FileInputStream("d://a.jpg");//2. 獲取response字節(jié)輸出流ServletOutputStream os = response.getOutputStream();//3. 完成流的copy/* byte[] buff = new byte[1024];int len = 0;while ((len = fis.read(buff))!= -1){os.write(buff,0,len);}*/IOUtils.copy(fis,os);fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
五、項目小實戰(zhàn)【用戶登錄注冊】
loglin.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>login</title><link href="css/login.css" rel="stylesheet">
</head><body>
<div id="loginDiv"><form action="/request-response/loginServlet" method="post" id="form"><h1 id="loginMsg">LOGIN IN</h1><p>Username:<input id="username" name="username" type="text"></p><p>Password:<input id="password" name="password" type="password"></p><div id="subDiv"><input type="submit" class="button" value="login up"><input type="reset" class="button" value="reset"> <a href="register.html">沒有賬號?點擊注冊</a></div></form>
</div></body>
</html>
register.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>歡迎注冊</title><link href="css/register.css" rel="stylesheet">
</head>
<body><div class="form-div"><div class="reg-content"><h1>歡迎注冊</h1><span>已有帳號?</span> <a href="login.html">登錄</a></div><form id="reg-form" action="/request-response/registerServlet" method="post"><table><tr><td>用戶名</td><td class="inputs"><input name="username" type="text" id="username"><br><span id="username_err" class="err_msg" style="display: none">用戶名不太受歡迎</span></td></tr><tr><td>密碼</td><td class="inputs"><input name="password" type="password" id="password"><br><span id="password_err" class="err_msg" style="display: none">密碼格式有誤</span></td></tr></table><div class="buttons"><input value="注 冊" type="submit" id="reg_btn"></div><br class="clear"></form></div>
</body>
</html>
LoginServlet.java
and RegisterServlet.java
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用戶名和密碼String username = request.getParameter("username");String password = request.getParameter("password");//2. 調(diào)用MyBatis完成查詢//2.1 獲取SqlSessionFactory對象/* String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();//2.2 獲取SqlSession對象SqlSession sqlSession = sqlSessionFactory.openSession();//2.3 獲取MapperUserMapper1 userMapper = sqlSession.getMapper(UserMapper1.class);//2.4 調(diào)用方法User user = userMapper.select(username, password);//2.5 釋放資源sqlSession.close();//獲取字符輸出流,并設(shè)置content typeresponse.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();//3. 判斷user釋放為nullif(user != null){// 登陸成功writer.write("登陸成功");}else {// 登陸失敗writer.write("登陸失敗");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用戶數(shù)據(jù)String username = request.getParameter("username");String password = request.getParameter("password");//封裝用戶對象User user = new User();user.setUsername(username);user.setPassword(password);//2. 調(diào)用mapper 根據(jù)用戶名查詢用戶對象//2.1 獲取SqlSessionFactory對象/* String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);*/SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();//2.2 獲取SqlSession對象SqlSession sqlSession = sqlSessionFactory.openSession();//2.3 獲取MapperUserMapper1 userMapper = sqlSession.getMapper(UserMapper1.class);//2.4 調(diào)用方法User u = userMapper.selectByUsername(username);//3. 判斷用戶對象釋放為nullif( u == null){// 用戶名不存在,添加用戶userMapper.add(user);// 提交事務(wù)sqlSession.commit();// 釋放資源sqlSession.close();}else {// 用戶名存在,給出提示信息response.setContentType("text/html;charset=utf-8");response.getWriter().write("用戶名已存在");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}