Tomcat&Web结构和Servlet入门

走远了吗. 提交于 2019-12-21 09:02:59

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");
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!