javaWeb开发
基础知识
html基础
http协议
: 超文本传输协议, 是应用层协议, 基于TCP/IP
url
: 协议名+DNS域名+请求文件名
http协议原理:
- 浏览器向dns服务器请求域名的ip
- dns回复ip地址
- 浏览器和ip的80端口建立TCP连接
- 浏览器发送请求, 要求获取 index.html
- 百度服务器响应, 发送文件 index.html
- tcp连接被释放
- 浏览器显示 index.html
jsp文件 几乎和 html 没区别 , 但是中间有很多动态代码, 运行起来更兼容, 在开头新增了
< % @ page language = "java"
contentType = "text/html; charset=UTF-8"
pageEncoding = "UTF-8" % >
Servlet技术
Java Servlet 是运行在 Web 服务器或应用服务器上的程序, 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.
Servlet本身没有main()方法, 需要受控于Servlet容器. Tomcat 就是 Servlet的运行容器之一.
Servlet容器的作用就是获取请求, 然后调用 某个Servlet, 然后把执行结果返回给客户
Servlet 若想被外界访问, 不虚把程序映射到一个url上, 通过web.xml完成
servlet
init() 初始化
request response service() destory()
两个实现类
GenericServlet
HttpServlet
package myServlet
## eclipse中的操作
新建完东西记得按F5刷新一下左侧的目录
新建web工程
new project-> Web -> Dynamic Web Project
留意一眼Configuration里面是不是选好了tomcat
最好是摁两次Next, 然后在最后的界面选中自动生成 web.xml的选项. 最后它会生成在 `WebContent/WEB_INF` 下, 当然后续新建也可以, 只是要自己手写.
project是按照小驼峰命名法
jsp文件都在 WebContent 下, new完输入名字后直接 finish 即可
新建servlet
src右键->new->servlet
然后输入包名和类名, 就可以新建了
在doPost里面使用out填入html内容
Jsp中
表单修改为
``` html
```
同时给 TestHttpServlet 上面加一行(但是自带一个和类名相同的注解)
``` java
@WebServlet("/testhttpservlet")
public class TestHttpServlet extends HttpServlet {
// 略去
}
```
运行效果
``` html
"提交"按钮按下后的效果:
This is class myServlet.TestHttpServlet, using the POST method
```
TestServletConfig
doGet()里面可以读取web.xml文件中的配置文件, 可以读出某些参数
java类程序的更改, 也要重新启动服务才行
## ServletContext
重点!!!!! 这里被坑了
`response.setContentType("text/html;charset=utf-8");` 中文输出, 如果没这行代码就会有乱码(指response.getWriter()乱码)
ServletContext即servlet上下文. 服务器会为每一个工程创建一个对象, 这个对象就是ServletContext对象. 这个对象全局唯一, 而且工程内部的所有servlet都共享这个对象. 所以叫全局应用程序共享对象.
``` java
// 有两种方式进行设置
// 第一种方法
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("name", "小明");
out.println("将 name=小明 写入了ServletContext");
// 取出ServletContext的某个属性
//首先获取到ServletContext,采用第二种方式
//ServletContext servletContext1 = this.getServletContext();
//从Web应用的ServletContext中取出属性
String name = servletContext.getInitParameter("username1");
out.println("
");
out.println("username="+name);
```
ServletConfig 读取资源文件
数据库一般是写在 `dbinfo.proprties` 中, 名字可以改但是注意后缀不要改, 在里面写数据库的账号和密码
一般想要直接读取信息, 不需要相应内容, 直接就doGet就行
需要页面相应的时候用doPost
doGet()
1. 设置 utf-8
2. 获取输入(也可以读取配置文件)
3. 建立 ServletConfig
4. 可以用out.println()输出信息
``` java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 类加载器的默认读取路径是src根目录
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("dbinfo.properties");
// 另一种写法
// 注:这里没有是用类加载器,而是使用 getServletContext()方法来读取配置信息
// 这种方法的默认读取路径就是Web应用的根目录
// InputStream stream = this.getServletContext().getResourceAsStream("/dbinfo.properties");
// 创建属性对象
Properties properties = new Properties();
properties.load(stream);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
out.println("username="+username+";password="+password);
}
```
## web.xml
属性配置部署
欢迎界面
servlet配置, 在其中可以有 init-param 之类的
HttpServletResponse
发送响应信息
可以得到请求的url 资源名 ip地址端口号等
``` java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
Enumeration enumeration = request.getHeaderNames();
PrintWriter out = response.getWriter();
// 头
while (enumeration.hasMoreElements()) {
String headerName = enumeration.nextElement();
out.println(headerName + ":" + request.getHeader(headerName) + "
");
}
out.println("URL:" + request.getRequestURL() + "
"); // 方法返回客户端发出请求时的完整URL
out.println("URI:" + request.getRequestURI() + "
"); // 方法返回请求行中的资源名部分
out.println("QueryString:" + request.getQueryString() + "
"); // 方法返回请求行中的参数部分
// 客户机
out.println("RemoteAddress:" + request.getRemoteAddr() + "
");// 方法返回发出请求的客户机的IP地址
out.println("RemoteHost:" + request.getRemoteHost() + "
"); // 方法返回发出请求的客户机的完整主机名
out.println("RemotePort:" + request.getRemotePort() + "
"); // 方法返回客户机所使用的网络端口号
out.println("ServerName:" + request.getServerName() + "
");// 方法返回服务器名字
out.println("ServerName:" + request.getServerPort() + "
");// 方法返回服务器端口号
out.println("LocalAddress:" + request.getLocalAddr() + "
");// 方法返回WEB服务器的IP地址
out.println("Method:" + request.getMethod() + "
");// 得到客户机请求方式
}
```
转发功能
转发到index.jsp (内部转发, 从url中看不出来变化)
action中指定类去处理, 然后类中加注解, 然后类中的doPost中转发, 在index.jsp中接受
重定向(sendRedirect)和转发(getRequestDispatcher)的区别
### JSP
不用Jsp, 仅仅靠out.println()输出html代码也可以, 但是效率低下, 因此就采用了jsp的技术
即在之间嵌入Java代码
jsp最后会被自动翻译成 servlet文件, 然后执行.
使用的情况下, 会导致使用浏览器工具查看源代码会显示注释
使用<%-- --%>的情况下, 就不会显示
全局是说, 变量直到服务器关闭才释放, 也就是不同的浏览器都会使得这个数字增长, 且公用的同一个变量
``` java
<%! int count = 0; %>
<%= 表达式 %>
<%! 声明%> (声明全局变量, jsp中声明不需要在调用前面)
<% 代码段 %>
<%-- 注释 --%>
<%@ 指令名 属性="属性值" %>
指令是从jsp页面向服务器发送的消息, 它们不产生任何可见的输出, 为了告诉jsp引擎如何对jsp界面进行处理, 作用范围仅限于包含指令本身的jsp页面.(比如Jsp页面顶端的设置字符集的)
比如 page session对象作为缓冲 errorPage 就是异常错误时候的页面 isErrorPage 设置是否为出错页 contentType
include 类似头文件声明
```
taglib 标签库
1.jsp 是列表
2.jsp
也是一种内部跳转, 不会在url上显示
jsp内置对象
用表单的 action("2.jsp")的方式是直接转发, 会显示在url上
att2 att3 jsp
setAttribute
getAttribute
testatt -> att2 -> att3
内部定向
前缀C核心库(Core)
<%@ taglib prefix="c url=""%>
jspWriter: 是缓冲
session: 保留用户的登录信息
不是form就用doGet
路径可以写死, /testServlet/.... 或者 request.getContextPath()+'/....', 显然后者更方便
jsp作用域通信对象(没搞懂)
## javabean
javabean是符合一定规范编写的Java类, 不是一种技术, 而是一种规范. 大家针对这种规范, 总结了很多开发技巧、工具函数. 符合这种规范的类, 可以被其它的程序员或者框架使用.
规范如下:
1、所有属性为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口
新建类, 注意类就选普通的class即可
在类文件中, 写完成员, 直接右键 Source -> gennerate getters and setters 即可自动生成
猜想
javaBean 承接前端, 用setProperty转存到javaBean中去
但是这样没有长期保存, 所以需要用数据库
仅修改jsp文件不需要重启tomcat, 只需要刷新
scope作用域 page界面 session会话 request请求 application
`?level=AAA` 可以观察到作用域的效果
### mysql
JDBC java数据库连接
数据库和javabean中的列名一样
首先创建数据表
1. 加载驱动:将jar包放在 WEB_INF/lib下
Class.forName("com.mysql")
2. 获取连接
3. 获取向数据库发sql语句的statement对象
4. 向数据库发送sql,或许数据库返回的结果集
5. 从结果集中获取数据
PerparedStatement可以防SQL注入攻击
数据库连接一般是在servlet中做而不是在jsp中做
查看 basequery.jsp进行阅读
## 中文乱码问题汇总
1. 数据库在创建时就要utf-8
2. 使用response.getWriter()之前,一定要设置
response.setContentType("text/html; charset=utf-8");
[参考资料](https://blog.csdn.net/u014424628/article/details/50589966)
3. 使用 request之前,一定要 request.setCharacterEncoding("UTF-8");
4. 这个最坑爹,是在连接数据库的时候就要设置好传输用的编码格式
[参考资料](https://blog.csdn.net/qq_38496561/article/details/78946079)
5. 文件编码utf-8