文章目录
java servlet
1.可以通过访问Tomcat来找到文件资源
.html文件
2.可以通过访问Tomcat来找到操作资源
java类-----控制层Servlet
V:View 视图层 HTML+CSS+JS
C:Controller 控制层 HttpServlet
M:Model 模型层
数据处理Service
数据读写Dao
数据存储domain
DB:DataBase 数据库MySQL
如何在Tomcat中自己编写一个Java类(控制层Servlet)
- 自己定义一个类 通常叫XXXController (Servlet Action)
- 继承Tomcat提供的一个规则HttpServlet
- 重写一个方法service 有参数 没有返回值 (doPost doGet)
- 方法内部有两个参数HttpServletRequest HttpServletResponse
- 抛出两个异常 ServletException IOException
- 方法是没有返回值 void类型
- 需要告知Tomcat有一个自己定义类需要帮忙管理 web文件夹 WEB-INF文件夹
需要配置web.xml 请求名字----真实类全名 映射关系
<servlet>
<servlet-name>用来配对的名字</servlet-name>
<servlet-class>真实类全名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>用来配对的名字</servlet-name>
<url-pattern>/请求名字</url-pattern>
</servlet-mapping>
- 浏览器发送请求
访问操作资源
404 没有找到资源 检查xml文件 检查Controller类
405 没有找到执行方法 检查Controller类中的方法重写
servlet中文问题
get请求的处理方式
发送请求的时候 请求名字 携带的参数信息都在协议头中
浏览器解析的时候
如果Tomcat是老版本 get请求需要如下处理
String aname = request.getParameter("aname");
byte[] value = aname.getBytes("ISO-8859-1");
String newString = new String(value,"UTF-8");
如果Tomcat是新版本 可以不处理
post请求的处理方式
发送请求的时候 请求名字 协议头中
请求的参数信息是在协议体中(协议体只能传递字节)
浏览器解析的时候
控制层接受的时候已经组合成一个String字符串
发送请求的时候按照UTF-8形式 拆开字节
接受的时候request对象直接给我组合(按照平台默认的字符集)成一个String
在request组合之前告知 按照哪一种字符集进行组合
request.setCharacterEncoding("UTF-8");
Servlet类的管理机制
1. Servlet类的对象是单例设计模式(对象是唯一的)
采用生命周期托管的方式实现的
Tomcat底层有一个类似ServletController的类管理着我们的对象(servlet对象)
2. 单例对象的产生
立即加载(Tomcat启动的时候 底层集合内就存在对象啦)
延迟加载(Tomcat启动的时候没有对象产生 什么时候发送请求需要用到这个对象 才会创建)
Tomcat启动的时候 web.xml文件如果写错了 服务器启动会报错
证明Tomcat在启动的时候 就读取了我的web.xml配置文件
web.xml文件配置的目的 存储请求名字—真实资源类名的对应关系
3. Servlet对象的创建和销毁---->Servlet对象的生命周期问题
Tomcat为了更好的管理对象的产生和销毁
提供了三个方法---->标识Servlet对象的生命周期
init(); service(); destroy(); 重新部署项目
4. 默认效果是一个延迟加载的机制
是否可以改变成立即加载的方式呢?
加载Servlet对象的时候是否能携带一些信息?
web.xml文件(如果配置错误 启动Tomcat时候就产生问题)
说明Tomcat启动的时候读取了我们的配置文件---->请求 真实类名
启动时候可能会有很多的Servlet对象 如果是立即加载的话 内存压力很大
5. 如果想要改变对象的加载 从延迟的方式变成立即的方式(Tomcat启动的时候就创建对象)
在web.xml文件中添加一个配置就可以了
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
0开始的整数 整数越小加载越早
<load-on-startup>整数0</load-on-startup>
</servlet>
<servlet-mapping>
</servlet-mapping>
6. 在Servlet对象创建时,可以通过配置携带一些信息,就可以让Servlet对象读取到
<servlet>
<servlet-name><>
<servlet-class><>
<init-param>
<param-name>key1</param-name>
<param-value>value1</param-value>
</init-param>
<load-on-startup>整数0</load-on-startup>
</servlet>
<servlet-mapping>
</servlet-mapping>
在Servlet对象的init方法中进行读取 通常利用带ServletConfig参数的方法
String value = config.getInitParameter("key"); //某一个key对应的value
Enumeration = config.getInitParameterNames(); //获取全部的key
String = config.getServletName(); //获取当前Servlet类名
ServletContext application = config.getServletContext();//获取全局上下文对象
7. Servlet继承的关系???
自己写一个类—>继承抽象类HttpServlet
HttpServlet—>继承抽象类GenricServlet
GenricServlet–>实现了三个接口 Servlet ServletConfig Serializable
Servlet接口含有5个方法
init(ServletConfig config);
service(ServletRequest,ServletResponse);
destroy();
ServletConfig = getServletConfig();
String = getServletInfo();
ServletConfig接口含有4个方法
String value = config.getInitParameter(“key”);
Enumeration = config.getInitParameterNames();
String = config.getServletName();
ServletContext application = config.getServletContext();
GenricServlet抽象类体现出了缺省适配器模式
将上述两个接口中的8个方法全部添加了实现
只留下一个service抽象方法 需要用户自己填写逻辑
还添加了两个独有的方法 init(){} 无参数 log(){}
HttpServlet体现了对于协议的具体化
将父类service方法实现了
目的是将两个跨协议的参数强制转化成HTTP协议
自己添加了一个protected修饰的service方法(参数HttpServletRequest)
独有service方法的目的是通过请求发送的方式get/post
找寻对应具体的执行方法doGet doPost