Fork me on GitHub

java web项目实践

参考

Servlet+web.xml配置

连接数据库:需要在lib中添加依赖

搭建java web的开发环境

  • jdk环境
  • tomcat服务器
  • Eclipes

tomcat简介

tomcat是apache的一个开源项目,是一种常见的web服务器,jsp/servelet的容器。
安装成功之后,运行omcat/bin/startup.sh, windows下是运行startup.bat。访问localhost:8080。是一个带有猫的页面,证明成功。

tomcat服务器目录结构

/bin :binary(二进制的缩写),存放各种平台下启动和停止tomcat的命令文件,如startup.bat,shutdown.bat

/conf:存放tomcat的各种配置文件

/lib:存放tomcat服务器所需的第三方驱动各种jar文件

/log:存放在tomcat的日志文件

/temp:tomcat运行时用于存放临时文件

/webapps:当发布web应用时,默认会将web应用的文件发布到此目录中

/work:tomcat把由jsp生成的servlet放在此目录下

第一个java web项目(手动)

初始化

  • 在webapps中创建项目目录,比如webapps/myhome
  • 编写index.jsp
  • 创建WEB-INF目录
  • 运行
  • 能够访问localhost:8080/myhome/index.jsp

WEB-INF目录结构

  • WEB-INF是java的web应用的安全目录。—也就是客户端无法访问,只有服务端可以访问的目录。
  • web.xml:项目部署文件。
  • classes文件夹,用来放置*.class文件。
  • lib文件夹,用来存放需要的jar包。

eclipes集成tomcat

环境配置:

  • 配jre
    进入preference => java => install jres配置(推荐你自己安装的jre)

  • 集成tomcat
    进入preference => server => runtime enviroment

使用eclipes编写第一个web程序

new => project => web => dynamic web project 创建一个名叫mytest的项目

默认会产生一些项目结构。

在其中的WebRoot(或者WebContent)根目录内创建index.jsp, 在里面可以写一个hello world测试一下。

保存之后点击tab栏中的运行tomcat,(第一次运行需要选择你对应的tomcat版本),运行之后下面的控制台会给出一系列的提示信息,若没有报错,则可以在浏览器中访问localhost:8080/mytest/index.jsp,就可以看到你写的hello world啦。

修改tomcat服务器默认端口

修改conf/server.xml

1
2
3
4
<Connector port="8080"
protocol="HTTP/1.1"
connectionTomeout="20000"
redirectPort="8443">

修改完后重启tomcat就OK惹。

jsp



jsp简介

jsp全名为java server pages,其根本是一个简化的servelet设计,他实现了在Java中使用html标签。jsp动态网页技术标准也是javaee的标准。jsp和serbelet一样,是在服务器端执行的。

特点

  • java平台
  • 安全性高
  • 适合开发大型的,企业级的web应用程序

基础语法

指令

  • page: 通常用于页面的顶端,同一个页面有多个page指令
1
2
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
  • include:讲一个外部文件嵌入到当前jsp文件中,同时解析这个页面中的jsp语句
  • taglib:使用标签库定义新的自定义标签,在jsp页面中启用定制行为

注释

  • html注释:
1
<!-- --> //客户端不可见
  • jsp注释
1
<%-- --%> //客户端不可见
  • jsp脚本注释
1
2
3
4
单行注释
//
多行注释
/**/

jsp脚本

  • 在html中插入jsp脚本
1
2
3
4
5
6
<body>
true<h1>hello, my first JSP!大家好</h1>
true<%
out.println("hello javaee");
%>
</body>
  • jsp声明

在jsp页面中定义变量或方法:

1
2
3
4
5
6
<%!
String s = "张三";
int add(int x,int y) {
return x+y;
}
%>
  • 表达式

语法:

1
2
你好,<%=s %><br>
x+y=<%=add(2,3) %>
  • jsp页面的生命周期

用户发出请求index.jsp=>判断用户是否是第一次请求=>若是,jsp引擎把该文件转化为一个servelet,生成字节码文件并执行jspInit(),若不是,则直接访问字节码文件=>解析执行,jspService()

jspService()方法被调用来处理客户端的请求。对每一个请求,jsp引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求改jsp文件,则jsp引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低系统的资源需求,提高系统的并发量及相应时间。但也要注意多线程带来的同步问题,由于Servelet始终驻于内存,所以相应是非常快的。

  • 阶段项目

分别使用脚本和html打印99乘法表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
true<%!
String printMutiTable() {
String s = "";
truetruetruefor(int i=1;i<=9;i++) {
truetruetruetruefor(int j=1;j<=i;j++) {
s += i+"*"+j+"="+(i*j)+" ";
}
s += "<br>";
}
return s;
}
%>
true<h1>九九乘法表</h1>
true<hr>
true<%=printMutiTable() %>
</body>
</html>

jsp内置对象

内置对象简介

jsp内置对象是web容器创建的一组对象,不使用new关键字就可以使用的内置对象。

例如:

1
2
3
4
5
6
<%
int[] value = {60,70,80};
for(int i:value) {
trueout.println(i);
}
%>

常见的jsp内置对象:

  • out
  • request
  • response
  • session
  • application
  • page/pageContext/exception/config

web程序的请求与相应模式

用户发送请求(request)
服务器给用户相应(response)

out

out对象是JspWriter类的实例,是向客户端输出内容常量的对象。

常用方法:

  • void println()向客户端打印字符串
  • void clear()清除缓冲区的内容,如果在flush之后调用会跑出异常
  • void clearBuffer()清楚缓冲区内容,在flush之后不会抛出异常
  • void flush()将缓冲区内容输出到客户端
  • int getBufferSize()返回缓冲区的字节数大小,如果不设缓冲区则为0
  • int getRemaining()返回缓冲区还有多少可用
  • boolean isAutoFlush()返回缓冲区满时,是自动清空还是抛出异常
  • void close()关闭输出流

request/response

get和post区别

  • get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2kb。安全性较低但是效率比post方式高。适合提交数据量不大、安全性不高的数据,比如搜索、查询。
  • post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高大用户信息,比如注册、修改、上传等。

request对象

客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出相应。它是HttpServletRequest类等实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。

  • String getParameter(String name)返回name指定参数的参数值
  • String[] getParameterValues(String name)返回包含参数name的所有所有值的数组
  • void setAttribute(String, Object)存储此请求中的属性
  • object getAttribute(String name)返回指定属性的属性值
  • String getContentType()得到请求体的mime类型
  • String getProtocol()返回请求用的协议类型以及版本号
  • String getServerName()返回接受请求都服务器主机名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- reg.jsp -->
<h1>用户注册</h1>
<hr>
<form action="request.jsp" method="post" name="regForm">
true<table>
truetrue<tr>
truetruetrue<td>用户名:</td>
truetruetrue<td>
truetruetruetrue<input type="text" name="username">
truetruetrue</td>
truetrue</tr>
truetrue<tr>
truetruetrue<td>密码:</td>
truetruetrue<td>
truetruetruetrue<input type="password" name="password">
truetruetrue</td>
truetrue</tr>
truetrue<tr>
truetruetrue<td>爱好:</td>
truetruetrue<td>
truetruetruetrue<input type="checkbox" name="favorite" value="read">读书
truetruetruetrue<input type="checkbox" name="favorite" value="music">音乐
truetruetruetrue<input type="checkbox" name="favorite" value="movie">电影
truetruetruetrue<input type="checkbox" name="favorite" value="internet">上网
truetruetrue</td>
truetrue</tr>
truetrue<tr>
truetruetrue<td colspan="2">
truetruetruetrue<input type="submit" value="提交">
truetruetrue</td>
truetrue</tr>
true</table>
</form>
<hr>
<a href="request.jsp?username=哈哈&password=123">测试url传递参数</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!-- request.jsp -->
<h1>request 内置对象</h1>
<%
request.setCharacterEncoding("utf-8"); // 解决中文乱码问题,无法解决URL传递中文乱码问题。
request.setAttribute("sex","男");
%>
用户名:<%=request.getParameter("username") %>
密码:<%=request.getParameter("password") %>
爱好:<%
if(request.getParameterValues("favorite")!=null) {
String[] favorites = request.getParameterValues("favorite");
truetruetruefor(int i=0;i<favorites.length;i++) {
truetruetruetrueout.println(favorites[i]);
truetruetrue}
truetrue}
true %>
性别:
<%=request.getAttribute("sex") %><br>
请求体都mime类型:
<%=request.getContentType() %><br>
协议类型以及版本号:
<%=request.getProtocol() %>><br>
服务器都主机名:
<%=request.getServerName() %>
服务器端口号:
<%=request.getServerPort() %><br>
请求客户端都IP地址:
<%=request.getRemoteAddr() %><br>
请求都真实路径:
<%=request.getRealPath("request.jsp") %><br>
请求的上下文路径:
<%=request.getContextPath() %>
1
2
3
<!-- server.xml -->
<!-- URIEncoding="utf-8"解决url传递中文乱码问题 -->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>

response对象

response对象包含了相应客户请求的有关信息,但在jsp中很少直接用它。它是HttpServletResponse类的实力。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。常用方法:

  • String getCharacterEncoding()返回相应用的是何种字符编码
  • void setContentType(String type)设置相应的mime类型
  • PrintWriter getWriter()返回可以想客户端输出字符的一个对象
  • sendRedirect(java.lang.String location)重新定向客户端的请求
1
2
3
4
5
6
7
8
9
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.setContentType("text/html;charset=utf-8");//设置相应的mime类型
trueout.println("<h1>response内置对象</h1>");
truePrintWriter outer = response.getWriter();//获得输出流对象
trueout.println("大家好,我是response对象生产的输出流outer对象");
response.sendRedirect("reg.jsp");
%>

请求转发与请求重定向

  • 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL会改变。

  • 请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏URL不会改变。

session

什么是session

  • session表示客户端与服务器的一次会话。
  • web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
  • 从上述定义来看,session实际上时一个特定的时间概念。
  • 在服务器的内存中保存着不同用户的session。

session对象

  • 是一个jsp内置对象
  • session对象在第一个jsp页面被装载时自动创建,完成会话期管理。
  • 从一个客户打开浏览器并连接到服务器开始,到关闭浏览器离开这个服务器结束,被称为一个会话。
  • 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种方法知道这是一个客户,就需要session对象。
  • session对象时HttpSession类的实例。

session对象常用方法:

  • long getCreationTime():返回session创建时间(ms)
  • public String getId():返回session创建时jsp引擎为它设的唯一id号
  • public Object setAttribute(String name, Object value):使用指定名称将对象绑定到此对话
  • public Object getAttribute(String name):返回与此对话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null
  • String[] getValueNames():返回一个包含此session中所有可用属性的数组
  • int getMaxInactiveInterval():返回两次请求间隔多长时间此session被取消

session的生命周期

  • 创建:当客户端第一次访问某个jsp或者servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
  • 活动:除非本次会话的所有页面都关闭后再重新访问某个jsp或者servlet将会创建新的会话。
  • 销毁:1、session.invalidate() 2、Session过期 3、服务器重启

application

其他内置对象

项目案例

undefined