JavaWeb开发(服务器端)
静态Web资源 html css js
用户在访问静态资源的时候 这些资源不会变
动态Web资源 jsd Servlet
用户在访问动态资源的时候 访问的内容是由代码生成
例如 不同用户访问不同的资源
用户(浏览器)通过网址来请求服务器端
请求就是服务器端上面的静态资源和动态资源
请求完成之后会给浏览器一个相应结果
服务器
Tomcat服务器
写的java代码 和前端html页面
全都是放到服务器上运行(服务器端开发是开发放到服务器上运行的代码 而不是开发一个服务器出来)
JavaEE规范服务器的一套规则(类和接口)
jsp和Servlet 就是这套规范一部分
Tomcat服务器下文件夹
bin 存放编译指令的(开启关闭服务)
conf 存放tomcat自己配置文件的
lib 存放tomcat依赖的jar包
logs 存放是用户访问服务器的日志(查看错误)
temp 存放临时文件的
webapps 默认存放应用程序的文件夹(你的工程)
work 存放tomcat自己工作文件
wtpwebapps与Eclipse关联后 工程存放的文件夹
利用命令行(终端开启tomcat服务)
1.前往tomcat的bin文件夹下
2.开启文件管理权限(读写)
sudo chmod 755 *.sh
3.开启服务(windows下执行的是.bat后缀的指令)
sudo sh ./startup.sh
访问网址:
http://IP地址:端口号/项目名称/访问的资源
通过这个网址查看tomcat服务是否启动
4.关闭服务
sudo sh ./shutdown.sh
工程被编译到服务器
实际上是把工程目录下的WebContent 文件夹编译进去
(WebContent本身不出现)
META-INF 扩展应用程序文件夹(暂时没用)
WEB-INF 存放着工程的所有资源
lib 存放工程使用的jar包(不用添加路径 会自动编译到服务器上)
web,xml 工程的配置文件
classes 工程编译到服务器上出现的
里面保存的是 你工程中的类的.class文件
注意:WEB-INF文件夹下存放的资源 是不能直接通过网址去访问的
Servlet(小服务程序) 是个java接口
访问服务器实际上是访问就 Servlet(容器 有访问动态资源)
javax.servlet.Servlet 包下的
注意:如果报错或提示出不来
修改或添加tomcat到你的工程中
Servlet的生命周期方法
实例化-->初始化-->服务方法-->销毁方法
Servlet只创建一次
当你再次访问该Servlet时 不会创建新的Servlet 只会重复调用服务方法 service方法
servlet的访问流程
用户发出一个请求
(http://localhost:8080/sh-web-01/demo01)
系统如何能创建出对应的servlet出来?
1.通过用户请求的网址会获取到项目的名称 /sh-web-01
2.找到你对应项目后从项目中找到该项目的web.xml文件
3.从web.xml文件中可以找到访问servlet的路径(/demo01)
4.通过servlet的路径找到用户 要访问哪一个servlet的名字(demo01)
5.通过servlet的名字 就能找到要创建的servlet 属于哪个类
6.系统就会通过反射创建该类的对象 然后就走生命周期的4个方法
web.xml的路径:WebContent-->WEB-INF-->web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml文件的版本号和编码格式 -->
<!-- 表示的是该xml文件的头 限制下面都能写什么标签 -->
<!-- 还建议你书写标签的一个顺序 -->
<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_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 工程的名字 -->
<display-name>sh-web-01</display-name>
<!-- 创建一个servlet -->
<servlet>
<!-- 给创建的servlet对象 起个对象名 -->
<servlet-name>demo01</servlet-name>
<!-- 设置servlet使用哪个类创建对象 -->
<!-- 注意:这里填全类名 -->
<servlet-class>com.lanou3g.Demo01</servlet-class>
<!-- 配置servlet创建优先级 数越小优先级越高-->
<!-- 加上这个设置 服务器启动就会创建该servlet -->
<!-- <load-on-startup>5</load-on-startup> -->
</servlet>
<!-- 设置servlet的映射(访问地址) -->
<servlet-mapping>
<!-- 表示要给哪一个servlet对象配置访问地址 -->
<servlet-name>demo01</servlet-name>
<!-- 设置访问地址 -->
<!--
http://localhost:8080/sh-web-01/demo01
/demo01 这个斜杠 表示的项目名后面斜杠
-->
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo02</servlet-name>
<servlet-class>com.lanou3g.Demo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo02</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo03</servlet-name>
<servlet-class>com.lanou3g.Demo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo03</servlet-name>
<url-pattern>/demo03</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo04</servlet-name>
<servlet-class>com.lanou3g.Demo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo04</servlet-name>
<!-- 利用通配符配置路径 -->
<!--
1. demo04配置的是绝对路径
2. *.后缀名 *.action
3. /*
4.系统使用默认的配置方法 不是给你用
凡是通过服务器访问的资源都是servlet
jsp html...
注意:2 3方式不能一起使用
匹配路径的优先级
绝对匹配 > / >后缀的
-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 一个servlet配置多个访问路径 -->
<servlet-mapping>
<servlet-name>demo04</servlet-name>
<url-pattern>/demo999</url-pattern>
</servlet-mapping>
<!-- 设置欢迎页面的 直接访问工程路径出现的页面 -->
<welcome-file-list>
<welcome-file>HelloWorld.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>
</web-app>
创建Servlet的第一种方式
直接实现Servlet接口
public class Demo01 implements Servlet{
//实例化方法(创建对象的无参构造方法)
public Demo01() {
System.out.println("实例化对象的无参构造方法");
}
//初始化方法(初始化Servlet的配置信息)
public void init(ServletConfig arg0) throws ServletException {
System.out.println("初始化init方法 被调用");
}
//服务方法(处理用户的请求处理完成之后 响应给用户)
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service方法被调用了");
}
//Servlet的销毁方法
//1.服务器关闭会调用
//2.该应用程序被移除也会调用
public void destroy() {
System.out.println("destroy销毁方法被调用了");
}
//获取Servlet配置信息的方法
public ServletConfig getServletConfig() {
return null;
}
//获取Servlet的版本 作者等信息的方法
public String getServletInfo() {
return null;
}
}
创建Servlet 方式2
继承GenericServlet类
(利用缺省适配方式 帮你简化代码 生命周期方法可以不写)
public class Demo02 extends GenericServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Demo02...service()方法");
}
}
方式三(常用)
直接继承HttpServlet
利用模板设计模式
public class Demo03 extends HttpServlet{
//重写doGet和doPost方法
//注意:从浏览器发送的请求都是get请求
//注意:重写完之后 不要调用父类的doGet方法 否则一样会发送错误出来
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
//两种请求 共用一个处理方法
doGet(req, resp);
}
}