Tomcat&Web结构和Servlet入门
B/S与C/S
B/S(Browser/Server):浏览器服务器模式
C/S(Client/Server):客户端服务端模式
动态网页与静态网页
静态网页
一旦页面写好之后,内容就不会改变,没有和后台程序交互
静态web资源开发技术: html
动态网页
一旦页面写好之后,内容会随着不同的时间点不停的变化和后台程序有交互
动态web资源开发技术:JSP/Servlet、ASP、PHP
Tomcat服务器
Java语言开发,称之Servlet容器,Tomcat的默认端口是8080
特点
1.服务器自己负责管理Servlet
2.拿到配置文件完全限定名
3.根据需求去设计Servlet的代码
4.JavaEE — Servlet,Java提供的一个标准[API]
(三)启动
1)方法一:
D:\Java\tomcat\apache-tomcat-8.0.41\bin\startup.bat
2)方法二:
通过软件打开[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hlqqUHkQ-1576852745262)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571811605138.png)]但是必须安装服务
打开cmd,输入service install
3)方法三(常用):
1.安装插件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqOBJvmv-1576852745264)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571811886582.png)],拷贝到D:\Java\eclipse\eclipse-jee-neon-2-win32-x86_64\eclipse\plugins
2.重启eclipse[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ywxU3sL7-1576852745264)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571812108333.png)]
3.配置Eclipse关联你要启动的Tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzC2scEX-1576852745265)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571812466549.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njlPSNpp-1576852745266)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571812592211.png)]
三、JavaWeb项目结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6V7klBVa-1576852745268)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571812731322.png)]
\apache-tomcat-7.0.57\webapps\ROOT\WEB-INF\web.xml(拷贝tomcat里面写好的)
四、发布Web项目到Tomcat
(1)方法一:
直接拷贝项目到D:\Java\tomcat\apache-tomcat-8.0.41\webapps
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FXw1x1Q7-1576852745268)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571813086834.png)]是默认首页,是默认进入的Tomcat的项目
在浏览器输入 http://localhost:8080/oa/index.html
(2)方法二:
通过配置文件,配置项目的路劲,oa 就是项目的根路劲
1.找到apache-tomcat-7.0.57\conf\Catalina\localhost
2.创建一个配置文件,比如oa.xml
<Context docBase="D:\oa" />//内容
(3)方法三(常用):
在server.xml里面进行配置,打开D:\Java\tomcat\apache-tomcat-8.0.41\conf\Server.xml
<Context docBase="D:\eclipseWorkSpace\Day10.22\webapp" path="/oa" />//在最后面host上面写
</Host>
docBase:项目得路劲在本机的那个位置
path: 上下文路劲 /oa访问对应的项目
五、Eclipse中搭建Web项目
1.创建一个Java项目
2.创建web程序目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trvf3Wlo-1576852745269)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571814021980.png)]
3.修改class的路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XL4dOI3o-1576852745270)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571814088171.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJlOQXCF-1576852745271)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571814096896.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9hkMFbF-1576852745272)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571814108375.png)]
六、Servlet
所有创建,运行,销毁都由Servlet容器完成
(一)创建和运行Servlet
1.搭建一个Web项目,导入Servlet的jar 包(D:\Java\tomcat\apache-tomcat-8.0.41\lib\servlet-api.jar)
2.新建一个Servlet类
(1)写一个中间的父类MyHttpServlet implements Servlet
(2)写一个HelloServlet extends MyHttpServlet(自己实现HelloServlet必须提供公共的无参数的构造方法)
3.在web.xml 中进行Servlet的配置
<servlet><!-- 为你的一个Servlet配置了名字 -->
<servlet-name>hello</servlet-name>
<servlet-class>cn.itsource._01HelloServlet.HelloServlet</servlet-class>
<!-- 初始化参数配置 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
4.映射一个向外暴露的地址
<servlet-mapping>
<!-- 这是servlet的名字,必须和上面配置的名字一样 -->
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
5.访问
http://ip地址:端口/上下文路径/我们自己映射的路径
http://localhost:8080/oa/hello
(二)生命周期
构造方法 ----> init(初始化)方法 ----> service(服务)方法【每次访问执行 】---->destory(销毁)方法【正常关闭才执行】
1.Servlet只有一个,是单例模式,使用的是缓存
2.再次使用的时候:只调用service
(三)执行流程
1.用户在浏览器端输入地址
2.到server.xml中先找到上下文路径,找到我们的项目
3.找到项目中的web.xml文件,找到映射的地址
(四)钩子方法
public class MyHttpServlet implements Servlet{
private ServletConfig servletConfig;
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return this.servletConfig;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
this.servletConfig = arg0;
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("父类的服务方法");
HttpServletRequest srq = (HttpServletRequest)arg0;
HttpServletResponse srp = (HttpServletResponse)arg1;
service(srq, srp);
}
//钩子方法,重写服务方法
public void service(HttpServletRequest srq,HttpServletResponse srp){
System.out.println("父类的钩子方法");
}
}
public class HelloServlet extends MyHttpServlet {
@Override
public void service(HttpServletRequest srq,HttpServletResponse srp){
System.out.println("子类重写钩子方法");
ServletConfig servletConfig = super.getServletConfig();
}
}
七、ServletConfig(初始信息)
1.配置对象的信息
public void init(ServletConfig arg0) throws ServletException {
ServletContext sc = arg0.getServletContext();
}
2.拿到一个web项目的上下文路径
sc.getContextPath()// /oa
3.拿到Servlet的名字
arg0.getServletName()//hello
4.根据名称拿到初始化参数
arg0.getInitParameter("encoding")//UTF-8
5.拿到初始化参数的名称
Enumeration<String> init = arg0.getInitParameterNames();
while (init.hasMoreElements()) {
System.out.println(init.nextElement());//encoding
}
八、HttpServlet
以后我们写Servlet的时候,不去实现Servlet,而是直接继承HttpServlet
(一)前台到后台
action="/oa/hello"
(二)清除缓存
1)项目清理:Project ----> Clean
2)清理浏览器
3)清理Tomcat:D:\Java\tomcat\apache-tomcat-8.0.41work\Catalina\localhost 里面的全部删除
(三)处理请求方式
都封装成了一个HttpServletRequest对象
1)方法一:
在doGet中调用doPost
2)方法二:
在doPost中调用doGet
3)方法三:
直接在我们自己的Servlet中来写service方法
九、 HttpServletRequest (请求对象)
1.获取上下文路径
String path = srq.getContextPath();// /oa
2.根据指定的请求头获取对应的请求头的值
String header = srq.getHeader("Accept-Language");//zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
3.获取资源标识符
String uri = srq.getRequestURI();// /oa/hello
4.获得统一资源
StringBuffer url = srq.getRequestURL();// http://localhost:8080/oa/hello
5.获得请求服务器的客户端的IP
String addr = srq.getRemoteAddr();//127.0.0.1
6.根据参数名称,获取对应参数的值
String[] values = srq.getParameterValues("hobby");
System.out.println(Arrays.toString(values));//[球, 跑, 游]
7.获取所有请求参数的名字
Enumeration<String> names = srq.getParameterNames();
while (names.hasMoreElements()) {
System.out.println(names.nextElement());//username、password、hobby
}
8.返回请求参数组成的Map集合,
key:参数名称
value:参数值,封装在String数组中
Map<String, String[]> map = srq.getParameterMap();
Set<Entry<String,String[]>> entrySet = map.entrySet();
for (Entry<String, String[]> entry : entrySet) {
System.out.println(entry.getKey()+Arrays.toString(entry.getValue()));//username[123]、password[234]、hobby[球, 跑, 游]
}
十、HttpServletRespons(响应对象)
响应内容(可以是文字也可以是另一个html页面)
PrintWriter writer = srp.getWriter();
writer.write("提交成功!");
十一、解决乱码问题
1.解决请求post乱码问题
srq.setCharacterEncoding("UTF-8");
2.解决响应的乱码问题
srp.setContentType("text/html;charset=UTF-8");
来源:CSDN
作者:剑眉
链接:https://blog.csdn.net/yy971733014/article/details/103639611