文章目录
一、软件两种形式:
1.B/S架构:
B/S也就是我们常用的浏览器/服务器端;
2.C/S架构:
客户端/服务器端;这种方式虽然也常用,但是需要下载相应的软件来搭配使用;
二、Web概述:
1.Web资源:
在浏览器中,Web资源分为两种:一种是静态资源、一种是动态资源;
区别: 静态资源是写死在HTML、css、js之上的音频,文本、视频等;而动态资源则是来自于服务器端的数据库之内的;
2.常见的Web服务器:
名称 | 种类 | 公司 | 描述 |
---|---|---|---|
WebLogic | 大型服务器 | Oracle | 收费 非开源 支持全部JavaEE规范 |
WebSphere | 大型服务器 | IBM | 收费 非开源 支持全部JavaEE规范 |
Glass Fish | 中型服务器 | Oracle | 免费 开源 支持部分JavaEE规范 |
JBoss | 中型服务器 | JBoss | 免费 开源 支持部分JavaEE规范 |
Resin | 小型服务器 | Caucho | 免费 开源 支持部分JavaEE规范 |
Jetty | 内置式服务器 | Jetty/eclipse | 免费 开源 支持部分JavaEE规范 |
Tomcat | 小型服务器 | Apache | 免费 开源 支持部分JavaEE规范 |
3.简单模拟Web服务器:
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(998);
Socket socket = server.accept();
FileInputStream fis = new FileInputStream(new File("G:\\代码\\java\\qrsx\\demo4\\webdemo\\index.html"));
byte[] bytes = new byte[1024];
int len = -1;
OutputStream out = socket.getOutputStream();
while ((len = fis.read(bytes)) != -1) {
out.write(len);
}
fis.close();
socket.close();
server.close();
}
多线程版本:
public class Mycat extends Thread {
private Socket socket;
private File file = new File("G:\\代码\\java\\qrsx\\demo4\\webdemo\\index.html");
public Mycat(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
OutputStream out = socket.getOutputStream();
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = -1;
while ((len = fis.read(bytes)) != -1) {
out.write(bytes);
}
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(998);
while (true) {
Socket socket = server.accept();
Mycat mycat = new Mycat(socket);
mycat.start();
}
}
}
三、Tomcat:
1.目录结构:
目录: | 内容: |
---|---|
bin | 存放tomcat所有可执行文件 |
conf | 存放tomcat的配置文件 |
lib | 存储tomcat运行过程中用到的jar包,存放类库的地方 |
logs | 存放tomcat启动的日志文件 |
temp | 存放产生的临时文件 |
webapps | 存储部署项目的位置 如果项目需要被外网访问,则需要部署到该目录 |
work | 存储tomcat运行过程中编译产生的文件 比如jsp编译后的文件 |
2.启动常见问题:
- 服务器启动一闪而过:
- 问题:没有配值Java_home
- 解决方式:配置Java_home
- tomcat默认端口被占用:
解决方式:- 杀死占用8080端口的程序
- 修改默认端口;在conf/server.xml的69行
3.Web项目的部署方式:
- 直接将项目复制到webapps目录下
- 配置虚拟目录:
项目可以存储在任何位置,但是要在conf / server.xml配置,这里的项目名也就是你访问的名字
<Context path="/项目名称" docBase="文件路径" />
- 在conf / Catalina目录下配置独立的xml文件,注意,这里的xml文件的文件名就是你访问的名字:
<Context docBase="文件路径" />
四、Servlet:
1.概述:
Servlet全称:Server Applet
可以理解为服务器小程序
一个运行在服务器端的小程序(其实就是一个Java类)
2.作用:
- 接受请求:服务器接受浏览器发送的请求
- 响应数据:服务器返回数据给浏览器的过程
3.Servlet开发步骤:
- 创建一个类,实现Servlet接口或者继承实现了Servlet接口的类
- 根据需求,实现接口中的方法,或者重写继承类的方法
- 在相应的方法中,处理请求,响应数据
- 配置Servlet访问路径(xml配置或者注解配置)
- 项目部署
- 打开浏览器访问servlet
样例代码:
//这就是注解配置的方式
@WebServlet(urlPatterns = "/login")
//urlPatterns相当于xml里面的url-pattern
public class loginServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
PrintWriter writer = servletResponse.getWriter();
writer.print("hello ps servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
XML配置:
<servlet>
<!--servlet名字-->
<servlet-name>login</servlet-name>
<!--servlet路径-->
<servlet-class>Servlet.loginServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--servlet名字-->
<servlet-name>login</servlet-name>
<!--前端页面访问地址,必须用-->
<url-pattern>/login</url-pattern>
</servlet-mapping>
4.servlet生命周期
- Servlet由web容器创建(tomcat服务器)
- Servlet在浏览器第一次访问的时候创建,且只会构造生成一个对象
- Servlet的service方法在每次访问的时候调用执行
- Servlet销毁:只会在服务器关闭或者重启的时候执行,且只有一次
- Servlet的init方法也只会执行一次,浏览器第一次访问的时候,分别调用构造方法和init方法;
5.servlet体系结构:
注意:在使用过程中,由于处理都是Http的请求,所以都直接继承HttpServlet来编写代码
6.HttpServlet
开发步骤:
由于它内部已经做过一定程度的修改和编写,所以在使用中,只需要很短的步骤就可以使用了;
- 创建Java类继承HttpServlet
- 重写doGet和doPost方法
其他步骤和之前直接实现Servlet接口的方式一致
样例代码:
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置请求格式,防止乱码
request.setCharacterEncoding("utf-8");
//2.获取请求体的信息
String username = request.getParameter("username");
String password = request.getParameter("password");
//3.验证登录是否成功
//这里一般调用数据库查询,查询得到返回1,查不到返回0
int flag = 0;
//4.根据结果返回数值
if (flag == 0) {
//5.没有成功,页面不动,继续等待输入
//重定向方式
response.sendRedirect("login.html");
} else {
//6.成功登录进入主页面
//6.1记录请求域信息,把信息传递给下一个页面
request.setAttribute("username", username);
//6.2页面跳转
//跳转方式
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//因为数据来了,之后是一样的,所以很多时候没必要分开写,所以可以直接调用
this.doPost(request, response);
}
}