Java web实习笔记目录导航
笔记(一)复习:
新建一个项目,创建一个新的servlet(SecondServlet,不要直接叫servlet)配置好web.xml,部署到Tomcat服务器上,通过浏览器访问到该servlet
一、HTTP协议
1.一种数据传输格式
2.数据包(报文)的形式
(1)请求数据包
①浏览器:服务器发送请求时
②请求行:请求浏览器以及地址信息
③消息头:以一种name-value的形式存在的数据
④实体内容:实体参数
(2)相应数据包
①服务器:服浏览器发送请求时
②状态行:信息提示码-状态码
③消息头
④实体内容
二、如何处理HTTP协议
1.使用Servlet
(1)任何的一个http的连接在传输数据时都会被分解为两个部分
①请求(HttpServletRequest)
②接受(HttpServletReseponse)
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Response;
/**
* @author HMM
* 所有自定义的servlet 都是servlet接口的实现类
*
*/
public class FirstServlet extends HttpServlet{
//重写service方法
/*
* 此方法中有两个参数
* HttpServletRequest 请求 请求数据报数据
* HttpServletResponse 响应 响应数据报的数据
* */
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("这是一个servlet,已经接收到前端的请求");
//当前访问此servlet的网址 http://localhost:8080/day01/firstServlet
String uri=request.getRequestURI();
System.out.println(uri);
//设置响应的编码格式,一定要在输出流之前,不然会乱码
response.setContentType("text/html;charset=UTF-8");
//做出响应 得到响应对象的网络输出流
PrintWriter out =response.getWriter();
out.println("你好啊");
}
}
三、写登录
1.登录界面
(1).新建login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<!--
method提交方式
get:路径传参,数据会附带在URL的尾部,安全性较低,数据传输量较少(2kB左右),请求数据
post:实体内容传参,安全性较高(默认不受限制),接收数据
action:表单
-->
<form action="login" method="post">
账号:<input type="text" name="code"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
注:如果是get方法
(2).新建LoginServlet
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到请求参数
String code=request.getParameter("code");
String pwd=request.getParameter("pwd");
//设置请求的编码格式,一定要在输出流之前,不然会乱码
response.setContentType("text/html;charset=UTF-8");
//做出相应,得到响应对象的网络输出流
PrintWriter out=response.getWriter();
if(code.equals("hmm")&&pwd.equals("123")) {
out.println("COME ON BABY!!");
}else {
out.println("啊哦...");
}
}
}
(3)在web.xml里添加配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>day01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 在浏览器端发送请求时,把这个请求基于HTTP协议发送到服务器,
在服务器内部通过servlet来处理HTTP协议,在分配到相应的servlet之前,会在
web.xml文件中进行请求的路径分析 -->
<servlet>
<!-- 3.找到之后找相应的servlet servlet class -->
<servlet-name>first</servlet-name>
<!-- 4.servlet 的完整路径(包括包名) -->
<servlet-class>web.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 2.找到别名之后根据相应的别名找到servlet中的别名 -->
<servlet-name>first</servlet-name>
<!-- 1. 网址,网名 ,根据网名找到相对应的别名servlet-name -->
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
三、JSP
四、JSP
1.jsp的组成部分
(1)HTML(主体部分)
(2)java代码
①java小脚本
②java表达式
③标签
(3)jsp特有语法
①jsp的标签 page include taglib
②el表达式:简化了java表达式
③jstl标签:简化了java代码
2.什么是JSP
(1)Servlet的页面表示形式,本质上是一个java代码(Servlet),jsp在架子啊时会先转换为java代码,再编译运行
3.WEB根目录下的文件和WEB-INF下的文件的区别
WEB-INF下的文件只能通过服务器访问(转发)
五、重定向和转发
1.重定向
服务器立刻发出一个响应给浏览器,发出的是一个302状态码和一个消息头(location=url)
(1)重定向的地址必须是浏览器能访问到地址,不能是WEB-INF下的,但是可以是相同服务器的其他网址或者其他服务器地址(重定向的地址实际上就是)
2.转发
同一个服务器内部进行的,将未完成的请求转交给下一个组件(web组件:Server,Filter,...)继续处理
3.区别
(1)重定向实际是浏览器进行了2次请求,转发只是一次请求
(2)地址栏的地址,重定向是改变的,但是转发没有改变
(3)重定向的地址(看上面),转发的地址只能是当前服务器地址(因为转发是在服务器内部进行的)
六、关系型数据库
1.遵循ORM映射
(1)数据库中的一张表对应Java中的一个实体类
(2)数据库中的一个字段名对应一个实体类中的成员变量
(3)数据库中的表数据,一条数据对应一个实体类对象
2.创建实体类
(1)重写toString方法
(2)添加无参和有参构造
(3)重写equals和hashCode方法
(4)实现序列化接口并生成唯一标识
package com.hmm.entity;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -1413125173463696530L;
private Integer userId;
private String userName;
private String userPassword;
//无参构造
public User() {
super();
// TODO Auto-generated constructor stub
}
//有参构造
public User(Integer userId, String userName, String userPassword) {
super();
this.userId = userId;
this.userName = userName;
this.userPassword = userPassword;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
result = prime * result + ((userName == null) ? 0 : userName.hashCode());
result = prime * result + ((userPassword == null) ? 0 : userPassword.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
if (userName == null) {
if (other.userName != null)
return false;
} else if (!userName.equals(other.userName))
return false;
if (userPassword == null) {
if (other.userPassword != null)
return false;
} else if (!userPassword.equals(other.userPassword))
return false;
return true;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userPassword=" + userPassword + "]";
}
}
3.使用JDBC连接数据库
(1)DBUtils.java
package com.hmm.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBUtils {
private static DataSource dataSource;
static {
try {
InputStream is = DBUtils.class.getClassLoader()
.getResourceAsStream("db.properties");
Properties p = new Properties();
p.load(is);
dataSource = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
return getDataSource().getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static void closeConnection(Connection conn){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(2)db.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hmm7
username=root
password=123456
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode\=true;characterEncoding\=utf8
(3)jar包(可自行下载)
jar包1下载地址:https://download.youkuaiyun.com/download/mogot7/10474753
(4)测试类:TestJdbc.java
package com.hmm.test;
import org.junit.Test;
import com.hmm.util.DBUtils;
public class TestJdbc {
@Test
public void test01() {
System.out.println(DBUtils.getConnection());
}
}
测试成功