2019-05-18
MVC开发思想
MVC(Model-View-Controller)
把一个应用的输入、处理、输出流程按Model(模型)、View(视图)、Controller(控制器)方式进行分解
- 视图(如JSP): 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
- 模型(如Service业务类和DAO类): 模型表示业务处理和数据处理。一个模型能为多个视图提供数据,这提高了应用程序的重用性。
- 控制器(Controller,如Servlet): 当用户提交请求时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理结果。
Servlet基本使用
实现了servlet接口的Java类,称之为Servlet。
HttpServlet是能够处理HTTP请求的servlet,它在原有Servlet接口上添加了HTTP协议处理方法,比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
1558159229330.png
模板:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
// doGet方法用来处理客户端浏览器地址栏直接访问、点击超链接、JS请求或以get方式提交的表单。
public void doGet(HttpServletRequest request, HttpServletResponse
response)throws ServletException, IOException {
}
// doPost方法用来处理以post方式提交的表单请求。
public void doPost(HttpServletRequest request, HttpServletResponse
response)throws ServletException, IOException {
}
}
注意事项:
在servlet中获取session对象
HttpSession session=request.getSession();
HttpSession session=request.getSession(boolean);
参数true表示如果session已经存在了,直接重用已经存在的session。如果session不存在,则新建。
参数false表示如果session已经存在了,直接重用已经存在的session。如果session不存在,则不新建,session不可用。
在servlet中获取ServletContext对象
ServletContext context = this.getServletContext();
在servlet使用response对象向客户端输出响应信息
PrintWriter out = response.getWriter();//获取字符流
OutputStream out = response.getOutputStream();//获取字节流
//注意:输出中文时,需要设置响应信息的MIME类型及编码
response.setContentType("text/html;charset=utf-8")
在web.xml文件中配置Servlet
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern> <!--form的action地址 -->
</servlet-mapping>
<!-- 说明:
<servlet-name>:指定Servlet的名字,要保证其在web.xml中唯一。
<servlet-class>:指定Servlet实现类。
<url-pattern>:指定Servlet的URI,即servlet相对于应用的访问路径。必须以/开头。-->
Servlet生命周期
Servlet类由程序员编写,但是由服务器来实例化,并且由服务器来调用相应的方法。
Servlet接口中有3个方法代表了Servlet的生命周期:
- init方法:初始化Servlet对象。在服务器装入Servlet实例时执行。在Servlet的生命周期中仅执行一次。无论有多少客户端访问Servlet,都不会重复执行。
- service方法:负责处理请求,无论请求方式是get还是post ,每次请求提交过来都会经过service方法来处理,然后转向到doGet或是doPost方法。
- destroy方法:负责释放资源,在关闭Web应用之时销毁Servlet。destroy方法仅执行一次,在服务器停止且卸载Servlet时执行。
Servlet是单例的,默认在第一次接收请求时实例化,并且只实例化一次。
Servlet在服务器关闭时销毁。
Servlet使用service方法处理所有业务请求,判断请求类型,再调用doGet或doPost处理请求。
如果在<servlet>元素中配置<load-on-startup>子元素,那么WEB应用程序在启动时就会装载并创建Servlet的实例、并调用Servlet实例的init方法。
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Servlet3.0新特性
Servlet3.0提供了如下注解(Annotation):
-
@WebServlet注解:修饰Servlet类
@WebServlet(name="Servlet名字",urlPatterns="url") @WebServlet("url")
-
@MultipartConfig注解:修饰Servlet,指定该Servlet将会处理multipart/form-data类型的请求(文件上传)
-
@WebFilter注解:用于修饰Filter类
@WebFilter(filterName="Filter名字",urlPatterns="url")
文件上传与下载
文件上传
基本步骤:
- 在客户端通过表单选择文件,提交到服务器
- 必须设置表单提交方式为post
- 必须设置表单的enctype属性为multipart/form-data,以二进制流方式封装表单数据
- 可对file域增加multiple属性实现多文件选择
- 服务器接收数据流,将数据流组装成文件,重命名文件(如当前时间+随机数+扩展名),将文件另存。
servlet3.0的request可以返回javax.servlet.http.Part对象封装用户上传的文件。Part对象通过如下方法返回文件相关信息:
Part part = request.getPart("file");
方法名 | 说明 |
---|---|
getName() | 返回表单文件域的name属性值 |
getContentType() | 返回上传文件的MIME类型,例如上传文件是jpg格式,则返回image/pjpeg |
getSize() | 返回上传文件的大小 |
getHeader("content-disposition") | 返回上传文件的报头信息。例如上传的文件名是girl.jpg,则返回form-data; name="productPic"; filename="C:\girl.jpg" |
write(String path) | 将文件另存至path指定的文件中 |
文件下载
基本步骤:
- 客户端发送下载请求
- 服务器端接收下载请求,找到要下载的文件,封装为File对象
- 建立输入流指向File对象,读取文件内容至字节数组
- 使用response对象进行下载参数设置
- 使用response获取输出流对象,将字节数组输出至客户端
- 关闭输出流
File f = new File(path);
InputStream in = new FileInputStream(f);
byte[] data = new byte[(int) f.length()];
in.read(data);
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(f.getName().getBytes("utf-8")));
response.addHeader("Content-Length", "" + f.length());
response.setContentType("application/octet-stream");
OutputStream out = response.getOutputStream();
out.write(data);
out.flush();
out.close();
网友评论