- 注册信息
a) 注册信息
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterServlet extends HttpServlet{
private static final long serialVersionUID = 3613835604998207857L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String[] hobbies = request.getParameterValues("hobbies");
System.out.println(name);
System.out.println(Arrays.asList(hobbies));
}
}
b) 注册的html
6.6
- 图片上传页面的编写
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 这里用到两个jar包 : commons-io-1.4.jar, commons-fileupload-1.2.2.jar
/*
* 1. 导入jar包至WEB-INF/lib下
*
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) {
String filename = null;
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件的大小限制为100M
factory.setSizeThreshold(1024 * 1024 * 100);
@SuppressWarnings("rawtypes")
List items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
@SuppressWarnings("rawtypes")
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
// 根据时间戳创建头像文件
filename = System.currentTimeMillis() + ".jpg";
// 通过getRealPath获取上传文件夹,如果项目在e:/project/j2ee/web,那么就会自动获取到
// e:/project/j2ee/web/uploaded
String photoFolder = request.getServletContext().getRealPath("uploaded");
File f = new File(photoFolder, filename);
f.getParentFile().mkdirs();
// 通过item.getInputStream()获取浏览器上传的文件的输入流
InputStream is = item.getInputStream();
// 复制文件
FileOutputStream fos = new FileOutputStream(f);
byte b[] = new byte[1024 * 1024 * 100];
int length = 0;
while (-1 != (length = is.read(b))) {
fos.write(b, 0, length);
}
fos.close();
} else {
System.out.println(item.getFieldName());
String value = item.getString();
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(value);
}
// 这前面这一段是照抄的
String html = "<img width='500' height='500' src='uploaded/%s' />";
response.setContentType("text/html");
PrintWriter pw= response.getWriter();
pw.format(html, filename);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html" charset="UTF-8"></meta>
<title>upload</title>
</head>
<!-- 需要上传的话 : form必须是post, get是不能上传问题件的, 而且还需要加上enctype="multipart/form-data"表示提交的数据是二进制文件 -->
<body>
<form action = "upload" method="post" enctype ="multipart/form-data">
用户名 : <input type ="text" name = "UserName" /><br>
头像 : <input type="file" name ="filepath" /><br>
<input type ="submit" value = "upload">
</form>
</body>
</html>
6.10 动态web项目
问题 1 :
问题 : The Apache Tomcat installation at this directory is version 7.0.64. A Tomcat 8.5 installation is expected.
解决方法 :单单在myeclipse中使用tomcat一下午就遇到了各种问题,我又不想埋怨自己手贱,只能吐槽它太不接地气了,现将几个问题的解决办法进行汇总,仅以此文献给同我一样<……虚话不说了>遇到这些问题的人。(此篇跟上两篇内容相连)
问题三
报错内容:
The Apache Tomcat installation at this directory is version 8.5.14. A Tomcat 8.0installation is expected.
解决办法:
①在本地tomcat的解压缩文件下:apache-tomcat-8.5.6\lib找到catalina.jar,
②打开catalina.jar\org\apache\catalina\util(打开方式选择2345好压,解压缩工具)
③写字板打开ServerInfo.properties,
④找到文件内容下方的server.info=Apache Tomcat/8.5.14,将其改为server.info=Apache Tomcat/8.0.8.5.14(就是在下载的版本号前面加一个8.0.)
6.20 JDBC
问题1 :
- JDBC学习
- 导包,bin里和外部包都要导入 (mysql-connector-java-5.0.8-bin.jar)
- 创建查询实体
package bean;
public class Hero {
public int id;
public String name;
public float hp;
public int damage;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
}
- 准备HeroDAO (用来增删改查)
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.Hero;
public class HeroDao {
public HeroDao() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root",
"admin");
}
public int getTotal() {
int total = 0;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select count(*) from hero";
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
total = rs.getInt(1);
}
System.out.println("total:" + total);
} catch (SQLException e) {
e.printStackTrace();
}
return total;
}
public void add(Hero hero) {
String sql = "insert into hero values(null,?,?,?)";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void update(Hero hero) {
String sql = "update hero set name= ?, hp = ? , damage = ? where id = ?";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, hero.name);
ps.setFloat(2, hero.hp);
ps.setInt(3, hero.damage);
ps.setInt(4, hero.id);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void delete(int id) {
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "delete from hero where id = " + id;
s.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public Hero get(int id) {
Hero hero = null;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select * from hero where id = " + id;
ResultSet rs = s.executeQuery(sql);
if (rs.next()) {
hero = new Hero();
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.name = name;
hero.hp = hp;
hero.damage = damage;
hero.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
return hero;
}
public List<Hero> list() {
return list(0, Short.MAX_VALUE);
}
public List<Hero> list(int start, int count) {
List<Hero> heros = new ArrayList<Hero>();
String sql = "select * from hero order by id desc limit ?,? ";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Hero hero = new Hero();
int id = rs.getInt(1);
String name = rs.getString(2);
float hp = rs.getFloat("hp");
int damage = rs.getInt(4);
hero.id = id;
hero.name = name;
hero.hp = hp;
hero.damage = damage;
heros.add(hero);
}
} catch (SQLException e) {
e.printStackTrace();
}
return heros;
}
}
4) 开始创建查询类(servlet)
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Hero;
import dao.HeroDao;
public class HelloListServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset = UTF-8");
List<Hero> heros = new HeroDao().list();
StringBuffer sb = new StringBuffer();
sb.append("<table align = 'center' border ='1' cellspacing = '0'>\r\n");
sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>");
String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>";
for(Hero hero : heros){
String tr = String.format(trFormat,hero.getId(),hero.getName(), hero.getHp(),hero.getDamage());
sb.append(tr);
}
sb.append("</table>");
response.getWriter().write(sb.toString());
super.service(request, response);
}
}
- 最后编写HelloListServlet
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Hero;
import dao.HeroDao;
public class HelloListServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset = UTF-8");
System.out.println("Coming into HelloServlet!!!");
List<Hero> heros = new HeroDao().list();
StringBuffer sb = new StringBuffer();
sb.append("<table align = 'center' border ='1' cellspacing = '0'>\r\n");
sb.append("<tr><td>id</td><td>name</td><td>hp</td><td>damage</td></tr>");
String trFormat = "<tr><td>%d</td><td>%s</td><td>%f</td><td>%d</td></tr>";
for(Hero hero : heros){
String tr = String.format(trFormat,hero.getId(),hero.getName(), hero.getHp(),hero.getDamage());
sb.append(tr);
System.out.println(tr);
}
sb.append("</table>");
System.out.println(sb);
response.getWriter().write(sb.toString());
}
}
6.20 http协议
1.
- http协议 请求协议
观察Network里的请求链接, 同时还要观察Params里的信息(是你传递的信息) - 请求头部信息 (这部分信息可以通过request来获得)
Host : 主机名
User-Agent : 浏览器的基本资料
Accept : 浏览器能够识别的响应类型
Accept-Language : 浏览器默认语言
Refer : 来路页面, 通过哪个页面到达此处的。
Connect : 是否保持连接。
- 响应协议
略
6.21 JSP
- 学习jsp
- 编写hello.jsp 网站
<!-- "text/html;charset=UTF-8" 相当于通知浏览器以UTF-8进行解码. pageEncoding="UTF-8" 告诉浏览器如果出现中文对其进行UTF-8编码
"java.util.*" 导入其他类, 如果导入多个类, 彼此用逗号分开.
%=new Date().toLocaleString() 相当于 response.getWriter().println(new Date().toLocaleString())
-->
<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
Hello,Han!
<br>
<%=new Date().toLocaleString() %>>
-
问题 : 为什么JSP可以在html中运行java代码?因为JSP被转译成了Servlet
- 把hello.jsp转译成hello_jsp.java
- 然后把hello_jsp.java编译成hello_jsp.class
- 执行hello_jsp, 生成html
- 通过http协议把html响应返回给浏览器
-
Jsp的组成
- 静态内容 : 就是html, css, javascript的内容
- 指令 : 以<%@ 开始, 以%>结尾 (范例如上)
- 表达式 <%=%>, 用以输出一段html
- Scriptlet 在<%%>之间可以写任何java代码
- 注释 : <%-- --%>
- Jsp的使用方法
<%@page language = "java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
<%
ArrayList<String> strs = new ArrayList<String>();
strs.add("han1");
strs.add("han2");
strs.add("han3");
strs.add("han4");
%>
<table width="300px" align="center" border="1" cellspacing="0">
<%for (String name : strs ) {%>
<tr>
<td><%=name%></td>
</tr>
<%}%>
</table>
- JSP include (如果每个页面共有的信息就只需要写一次, 每次调用即可)
- 指令include操作方法 :
i) 编写一个页面用来重复调用
ii) 然后再其他页面中, 使用指令调用 - 范例
<hr>
<p style = "text-align:center">copyright@2016
</p>
<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
Hello,Han!
<br>
<%=new Date().toLocaleString() %><br>
<%-- 以下两种效果相同 --%>
<%="hello jsp1" %> <br>
<h1><% out.println("hello jsp2"); %></h1>
<%@ include file = "footer.jsp"%>
-
动作include
i) 操作方法 : <jsp:include page=”footer.jsp”/> -
这两者的区别
i) 指令include : JSP会最终被转译成Servlet并与另一个jsp合并生成一个问题件
ii) 动作include : JSP是独立转译的, 最终将两个java文件转译成的文件合成, 是相互独立的, 会涉及到传参问题.
iii) 动作include传参解决方案 :<jsp:include page="footer.jsp"> <jsp:param name = "year" value = "2020"/> </jsp:include>
- JSP跳转
- 首先准备一个jump.jsp
- 服务器跳转 & 客户端跳转
Example :
i) 服务器跳转<%-- 这个jsp是用来跳转用的 --%> <%-- response.sendRedirect("hello.jsp"); 不用写成response.sendRedirect("j2ee/hello.jsp"); --%> <%-- 这是客户端跳转 --%> <% response.sendRedirect("hello.jsp"); %>
ii) 客户端跳转
```java
<%-- 这个jsp是用来跳转用的 --%>
<%-- response.sendRedirect(“hello.jsp”); 不用写成response.sendRedirect(“j2ee/hello.jsp”); --%>
<%-- 这是服务器跳转 --%>
<% request.getRequestDispatcher("hello.jsp").forward(request,response); %>
```
- JSP Cookie
- Cookie的作用, 保持登录状态(cooie是由服务器创建, 保存在用户本地)
- Cookie的使用方法
<%--
Cookie c = new Cookie("name","Gareen"); 创建一个Cookie
c.setMaxAge(24*60*60); 设定保存时间(设定为1天), 如果是0, 那么浏览器一关闭就销毁.
c.setPath("/"); path 表示访问服务器的所有应用都会提交这个cookie到服务器,
其值是/abc, 那么表示仅仅访问/abc路径的时候才会提交cookie到服务端.
--%>
<%
Cookie c = new Cookie("name","Gareen");
c.setMaxAge(24*60*60);
c.setPath("/");
response.addCookie(c);
%>
- Cookie的获取方法
<%
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (int i = 0; i <= cookies.length - 1; i++) {
System.out.println(cookies[i].getName() + " : " + cookies[i].getValue());
}
}
%>
- Session的学习
- Session的设值
// setSession.jsp
<%@ page language = "java" contentType = "text/html ; charset = UTF-8" pageEncoding = "UTF-8" import = "javax.servlet.*" %>
<%
session.setAttribute("name", "teemo");
%>
<a href = "getSession.jsp">跳转到获取session的页面 </a>
- Session的获值
// getSession.jsp
<%@ page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
String name = (String) session.getAttribute("name");
response.getWriter().write(name);
%><br>
session's name : <%=name%>```
- Session的有效期可以调整, 到服务器设置中调整
6.22 JSP
- JSP作用域
- 4个作用域
pageContext 当前页面
requestContext 一次请求
sessionContext 当前会话
applicationContext 全局,所有用户共享
- 4个作用域
- 范例
i) pageContext 当前页面 (只有当前页面可以获得参数)
这个结果是han
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%
pageContext.setAttribute("name", "han");
%>
<%= pageContext.getAttribute("name") %>
这个结果就是null
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%= pageContext.getAttribute("name") %>
ii) requestContext
这个结果是hxt
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%
//pageContext.setAttribute("name", "han");
request.setAttribute("name","hxt");
%>
<%=request.getAttribute("name")
//=pageContext.getAttribute("name")
%>
这个结果是null
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%= request.getAttribute("name") %>
```
一次请求跳转
```jsp
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%
request.setAttribute("name", "hxt1");
%>
<%
request.getRequestDispatcher("getContext.jsp").forward(request, response);
%>
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%= request.getAttribute("name") %>
结果就是hxt1
-
所以要搞清楚, 客户端和服务器端跳转的区别
-
sessionContext是会话是指一个用户代开网站的那一刻起, 无论访问多少网页, 连接都属于同一个会话, 知道浏览器关闭, 所以页面间传递数据也可以通过session传递.
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
<%
session.setAttribute("name","hxt2");
response.sendRedirect("getContext.jsp");
%>
<%@ page language = "java" contentType = "text/html; charset = UTF-8" pageEncoding = "UTF-8" %>
session.getAttribute =
<%= session.getAttribute("name") %>
- applicationContext 全局参数
- jsp的隐式对象
- 分别为 : request, response, out, pageContext, session, application, page, config, exception
- request : 表示请求
response : 表示响应
out : 代表输出
pageContext : 当前页面作用域
session : 当前会话作用域
application : 全局作用域
page : 在jsp中代表java中的this (代表当前页面) , 作用与this一样
config : config可以获取web.xml中的初始化参数(不推荐使用)
exception : 有时候页面中会出现一些异常需要解决, 那就需要这样一个页面进行 处理 - exception的范例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage = "catch.jsp"%>
<%
int[] a = new int[10];
a[20] = 20;
%>
<%=a[20]%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %>
错误信息是 : <br>
<%=exception %>