Servlet实现下载

1、Servlet 3.1之前实现文件上传

package ecut.request;

import java.io.BufferedReader;
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 FirstUploadServlet extends HttpServlet { private static final long serialVersionUID = -7777691027208490971L; @Override
protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
throw new RuntimeException( "不支持GET方式上传" );
} @Override
protected void doPost( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException { request.setCharacterEncoding( "UTF-8" ); // 上传文件时,只考虑文本文件,不考虑其它文件
BufferedReader reader = request.getReader();
//InputStream in = request.getInputStream(); String s ;
while( ( s = reader.readLine() ) != null ){
System.out.println( s );
} } }

2、Servlet 3.1 开始实现文件上传

package ecut.request;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; public class SecondUploadServlet extends HttpServlet { private static final long serialVersionUID = 4485463572490572537L; @Override
protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
throw new RuntimeException( "不支持GET方式上传" );
} @Override
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { // String username = request.getParameter( "username" ) ; // <input type="text" name="username" > Part part = request.getPart( "upfile" ) ; // <input type="file" name="upfile" >
System.out.println( part ); /* Servlet 3.0 中获得文件名的做法
String cd = part.getHeader( "Content-Disposition" );
System.out.println( cd );
String s = "filename=\"";
int index = cd.indexOf( s );//找到filename的位置
String name = cd.substring( index + s.length() , cd.length() - 1 );//获取文件名
System.out.println( name );
*/ // part.getName() ; // name="upfile"
String filename = part.getSubmittedFileName(); // Servlet 3.1 开始出现的方法 part.write( filename ); } }

Struts2实现下载

1、首先在配置文件中指定存储位置storePath,在配置文件中action标签中通过 param 为 当前的 Action 实例 指定一个参数 ,实际上是 Action 类中的一个 属性 。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts>
<package name="upload" namespace="/upload" extends="struts-default" > <action name="action/single" class="ecut.upload.SingleFileUploadAction" >
<!-- 通过 param 为 当前的 Action 实例 指定一个参数 ( 实际上是 Action 类中的一个 属性 ) -->
<param name="storePath">D:/</param> <result name="success" type="redirectAction">
<param name="actionName">success/single</param>
</result>
<result name="fail" type="redirectAction">
<param name="actionName">fail/single</param>
</result>
</action>
</struts>

2、struts.xml中的包继承了struts-default包,struts-default包中指定了默认的拦截器栈,里面有一个fileUpload interceptor,Struts 2实现文件上传就是由这个拦截器来实现的。所以在struts.xml中最好先引用一下默认拦截器。

3、参照fileUpload interceptor api 的完成Action类的编写,由图中可知需要添加以下参数

  • [File Name] : File - 实际文件名,和页面的文件名相对应,表单中是xxx,则Action类中也要有xxx属性,且名称保持一致
  • [File Name]ContentType : String - 文件的内容类型,命名前缀得和文件名称保持一致,xxxContentType
  • [File Name]FileName : String -上传文件的实际名称,命名前缀得和文件名称保持一致,xxxFileName

Jsp代码:

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts Upload</title>
</head>
<body> <h5>文件上传</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data -->
<form action="${ pageContext.request.contextPath }/upload/action/single" method="post" enctype="multipart/form-data">
<input type="file" name="upload" >
<input type="submit" value="上传" >
</form>
</body>
</html>

Action类代码:

package ecut.upload;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import com.opensymphony.xwork2.Action; public class SingleFileUploadAction implements Action { private static Logger logger = LogManager.getLogger();
//保存文件的位置,上传文件到那个目录
private String storePath ;
// [File Name] : File - the actual File,与表单中的name保持一致
private File upload ;
// [File Name]ContentType : String - the content type of the file,文件内容类型
private String uploadContentType ;
// [File Name]FileName : String - the actual name of the file uploaded (not the HTML name),实际的文件名
private String uploadFileName ; @Override
public String execute() throws Exception {
//临时文件
logger.info( "upload : " + upload );
logger.info( "content type : " + uploadContentType );
logger.info( "file name : " + uploadFileName ); //getCanonicalPath获取规范化路径
Path source = Paths.get( upload.getCanonicalPath() ); Path target = Paths.get( this.storePath , uploadFileName ); //Replace an existing file if it exists.
Files.copy( source , target , StandardCopyOption.REPLACE_EXISTING ); return SUCCESS;
} public String getStorePath() {
return storePath;
} public void setStorePath(String storePath) {
this.storePath = storePath;
} public File getUpload() {
return upload;
} public void setUpload(File upload) {
this.upload = upload;
} public String getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
} public String getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
} }

Struts2  上传文件是先生成一个临时文件保存在临时目录下,上传成功后临时文件消失。

4、上传默认的最大尺寸是,在 default.properties 中默认定义的大小是 2MB ,修改默认上传最大尺寸可以在xml中配置,可以指定全局的常量,也可以在action标签中设置某个action最大上传尺寸(struts.multipart.maxSize >= fileUpload.maximumSize )。

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 允许在 action 的 名称 中使用 / 字符 -->
<constant name="struts.enable.SlashesInActionNames" value="true" />
<!-- 启用动态方法调用 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> --> <!-- 修改 action 请求路径的后缀 -->
<constant name="struts.action.extension" value="do,," />
<!-- 解析器的作用是对request.getInputStream()返回的字节流进行解析获取文件内容、类型、名称(和resultType="stream" 实现下载原理一致) -->
<!-- 指定 对上传的 字节流进行解析的解析器 : jakarta 、cos 、pell -->
<constant name="struts.multipart.parser" value="jakarta" />
<!-- 指定上传文件的尺寸 ( 在 default.properties 中默认定义的大小是 2MB )-->
<constant name="struts.multipart.maxSize" value="2097152000" /> <package name="upload" namespace="/upload" extends="struts-default" > <action name="action/single" class="ecut.upload.SingleFileUploadAction" >
<!-- 通过 param 为 当前的 Action 实例 指定一个参数 ( 实际上是 Action 类中的一个 属性 ) -->
<param name="storePath">D:/</param> <result name="success" type="redirectAction">
<param name="actionName">success/single</param>
</result>
<result name="fail" type="redirectAction">
<param name="actionName">fail/single</param>
</result> <exception-mapping result="fail" exception="java.lang.Exception" /> <interceptor-ref name="defaultStack">
<!-- 必须满足 struts.multipart.maxSize >= fileUpload.maximumSize -->
<param name="fileUpload.maximumSize">20971520</param>
</interceptor-ref> </action> <action name="success/single">
<result>/WEB-INF/pages/upload/success_single.jsp</result>
</action> <action name="fail/single">
<result>/WEB-INF/pages/upload/fail_single.jsp</result>
</action> </package> </struts>

在配置文件中还可以指定解析器,struts 2的上传的与FirstUploadServlet 中的方法一致(servlet3.0之前上传的方式),需要去解析inputstream,strust 2 默认是jakarta解析器,去对inputStream 进行解析。如果超出最大尺寸会抛出异常,可以在action标签中指定局部的异常映射。

5、多文件上传测试案例

index.jsp

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Struts Upload</title>
</head>
<body> <h5>文件上传</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data -->
<form action="${ pageContext.request.contextPath }/upload/action/single" method="post" enctype="multipart/form-data">
<input type="file" name="upload" >
<input type="submit" value="上传" >
</form> <h5>文件上传</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data -->
<form action="${ pageContext.request.contextPath }/upload/action/multiple" method="post" enctype="multipart/form-data">
<input type="file" name="upload" >
<br>
<input type="file" name="upload" >
<br>
<input type="file" name="upload" >
<br>
<input type="file" name="upload" >
<br>
<input type="submit" value="上传" >
</form> </body>
</html>

success_single.jsp

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上传成功</title>
</head>
<body> <h1>上传成功</h1> </body>
</html>

fail_single.jsp

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上传失败</title>
</head>
<body> <h1>上传失败</h1> </body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 允许在 action 的 名称 中使用 / 字符 -->
<constant name="struts.enable.SlashesInActionNames" value="true" />
<!-- 启用动态方法调用 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> --> <!-- 修改 action 请求路径的后缀 -->
<constant name="struts.action.extension" value="do,," />
<!-- 解析器的作用是对request.getInputStream()返回的字节流进行解析获取文件内容、类型、名称(和resultType="stream" 实现下载原理一致) -->
<!-- 指定 对上传的 字节流进行解析的解析器 : jakarta 、cos 、pell -->
<constant name="struts.multipart.parser" value="jakarta" />
<!-- 指定上传文件的尺寸 ( 在 default.properties 中默认定义的大小是 2MB )-->
<constant name="struts.multipart.maxSize" value="2097152000" /> <package name="upload" namespace="/upload" extends="struts-default" > <action name="action/single" class="ecut.upload.SingleFileUploadAction" >
<!-- 通过 param 为 当前的 Action 实例 指定一个参数 ( 实际上是 Action 类中的一个 属性 ) -->
<param name="storePath">D:/</param> <result name="success" type="redirectAction">
<param name="actionName">success/single</param>
</result>
<result name="fail" type="redirectAction">
<param name="actionName">fail/single</param>
</result> <exception-mapping result="fail" exception="java.lang.Exception" /> <interceptor-ref name="defaultStack">
<!-- 必须满足 struts.multipart.maxSize >= fileUpload.maximumSize -->
<param name="fileUpload.maximumSize">20971520</param>
</interceptor-ref> </action> <action name="action/multiple" class="ecut.upload.MultipleFileUploadAction" >
<!-- 通过 param 为 当前的 Action 实例 指定一个参数 ( 实际上是 Action 类中的一个 属性 ) -->
<param name="storePath">D:/</param> <result name="success" type="redirectAction">
<param name="actionName">success/single</param>
</result>
<result name="fail" type="redirectAction">
<param name="actionName">fail/single</param>
</result> <exception-mapping result="fail" exception="java.lang.Exception" /> <interceptor-ref name="defaultStack">
<!-- 必须满足全局上传的文件尺寸最大值 struts.multipart.maxSize >= 单前action上传文件尺寸最大值fileUpload.maximumSize -->
<param name="fileUpload.maximumSize">20971520</param>
</interceptor-ref> </action> <action name="success/single">
<result>/WEB-INF/pages/upload/success_single.jsp</result>
</action> <action name="fail/single">
<result>/WEB-INF/pages/upload/fail_single.jsp</result>
</action> </package> </struts>

Action类

package ecut.upload;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import com.opensymphony.xwork2.Action; public class MultipleFileUploadAction implements Action { private static Logger logger = LogManager.getLogger(); private String storePath ; private List<File> upload ;
private List<String> uploadContentType ;
private List<String> uploadFileName ; @Override
public String execute() throws Exception {
logger.info("upload.get(0)对应的类型是uploadContentType.get(0),对应的文件名是uploadFileName.get(0)"); for(int i =0 ; i < upload.size(); i++){
//getCanonicalPath获取规范化路径
Path source = Paths.get( upload.get(i).getCanonicalPath() ); Path target = Paths.get( this.storePath , uploadFileName.get(i) ); //Replace an existing file if it exists.
Files.copy( source , target , StandardCopyOption.REPLACE_EXISTING );
}
return SUCCESS;
} public String getStorePath() {
return storePath;
} public void setStorePath(String storePath) {
this.storePath = storePath;
} public List<File> getUpload() {
return upload;
} public void setUpload(List<File> upload) {
this.upload = upload;
} public List<String> getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(List<String> uploadContentType) {
this.uploadContentType = uploadContentType;
} public List<String> getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(List<String> uploadFileName) {
this.uploadFileName = uploadFileName;
} }

Struts2实现国际化

1、简介

  • 国际化简称i18n,其来源是英文单词 internationalization的首末字符i 和n。18为中间的字符数。
  • 国际化即是对于Web应用来说,页面在不同的语言环境下需要显示不同的效果。
  • Struts2中使用到国际化的地方有: jsp页面的国际化、Action信息国际化、转换错误信息的国际化、校验错误信息的国际化;
  • Struts2国际化文件分类: 全局范围国际化文件 、包范围国际化文件 、Action类范围国际化文件。

2、普通实现表单方式和Struts 2 标签去完成表单比较

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>国际化</title>
<style type="text/css"> .login-form { width: 80% ; margin: 20px auto ; box-shadow: 0px 0px 5px 4px #d3d3d3; padding: 10px 10px ;} .login-form .form-row { height: auto ; overflow: hidden; border-bottom: 1px dotted #d3d3d3 ; padding-bottom: 5px ; }
.login-form .form-row:last-child { border: none ; }
.login-form .form-row i , .login-form .form-row b { height: 30px ; line-height: 30px ; }
.login-form .form-row i { float: left ; width: 30% ; text-align: right ; font-style: normal ; font-size: 18px ; }
.login-form .form-row b { float: right ; width: 70% ; text-align: left ; } .login-form .form-row b input {
margin-left: 1% ; padding-left : 4px ;
height: 20px ; line-height: 20px ; width: 96% ; border: 1px solid #dedede ; outline: none ;
} .login-form .buttons { width: 70% ; margin-left: 30% ; } .login-form .buttons span {
float : left ; width: 50% ; height: 30px ; line-height: 30px ;
} .login-form .buttons span:first-child {
text-align: center ;
} .login-form .buttons span:last-child {
text-align: center ;
} .login-form .buttons span input {
width: 80% ;
}
</style>
</head>
<body> <h3>原生HTML表单</h3> <div class="login-form">
<form action="${ pageContext.request.contextPath }/user/login" method="post" >
<div class="form-row">
<i>用户名:</i>
<b> <input type="text" name="username" ></b>
</div>
<div class="form-row">
<i>密码:</i>
<b> <input type="password" name="password" > </b>
</div>
<div class=" form-row">
<div class="buttons">
<span >
<input type="reset" value="重置">
</span>
<span>
<input type="submit" value="登录">
</span>
</div>
</div>
</form>
</div>
<hr> <h3>Struts 2 表单(不支持国际化)</h3>
<s:form namespace="/user" action="login" method="post" >
<s:textfield label="用户名" name="username" />
<s:password label="密码" name="password" />
<s:reset value="重置" />
<s:submit value="登录" />
</s:form> </body>
</html>

Struts 2实现表单需要先导入标签库,查看Struts 2源码可以得知Struts的表单是用表格实现的,因此两个按钮不在同一行,不太美观,不介意使用Struts实现表单。但是Struts 2实现表单得依赖于Struts 2的标签,因此我们需要先了解Struts 2编写表单。

3、配置文件编写

  • 国际化文件的命名规则

    基本名.properties 如:user_login.properties

    基本名_语言编码_国家编码.properties 如:user_login_en_US.properties, user_login_zh_CN.properties

    其中语言编码和国家编码是固定的,可以在JDK中Locale类的常量中找到。

  • 为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容基本是key-value对,其中key是程序使用的部分(页面需要和配置文件中一致),而value是程序的显示部分。

user_login_zh_CN.properties

user.login.username.label= User Name
user.login.password.label= Password
user.login.reset.button= Reset
user.login.submit.button= Login

user_login_en_US.properties

user.login.username.label=用户名
user.login.password.label=密码
user.login.reset.button=重置
user.login.submit.button=登录

index.jsp

<%@ page language = "java" pageEncoding = "UTF-8" %>
<%@ page contentType = "text/html; charset= UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>国际化</title>
<style type="text/css"> .login-form { width: 80% ; margin: 20px auto ; box-shadow: 0px 0px 5px 4px #d3d3d3; padding: 10px 10px ;} .login-form .form-row { height: auto ; overflow: hidden; border-bottom: 1px dotted #d3d3d3 ; padding-bottom: 5px ; }
.login-form .form-row:last-child { border: none ; }
.login-form .form-row i , .login-form .form-row b { height: 30px ; line-height: 30px ; }
.login-form .form-row i { float: left ; width: 30% ; text-align: right ; font-style: normal ; font-size: 18px ; }
.login-form .form-row b { float: right ; width: 70% ; text-align: left ; } .login-form .form-row b input {
margin-left: 1% ; padding-left : 4px ;
height: 20px ; line-height: 20px ; width: 96% ; border: 1px solid #dedede ; outline: none ;
} .login-form .buttons { width: 70% ; margin-left: 30% ; } .login-form .buttons span {
float : left ; width: 50% ; height: 30px ; line-height: 30px ;
} .login-form .buttons span:first-child {
text-align: center ;
} .login-form .buttons span:last-child {
text-align: center ;
} .login-form .buttons span input {
width: 80% ;
}
</style>
</head>
<body> <h3>原生HTML表单</h3> <div class="login-form">
<form action="${ pageContext.request.contextPath }/user/login" method="post" >
<div class="form-row">
<i>用户名:</i>
<b> <input type="text" name="username" ></b>
</div>
<div class="form-row">
<i>密码:</i>
<b> <input type="password" name="password" > </b>
</div>
<div class=" form-row">
<div class="buttons">
<span >
<input type="reset" value="重置">
</span>
<span>
<input type="submit" value="登录">
</span>
</div>
</div>
</form>
</div>
<hr> <h3>Struts 2 表单(不支持国际化)</h3>
<s:form namespace="/user" action="login" method="post" >
<s:textfield label="用户名" name="username" />
<s:password label="密码" name="password" />
<s:reset value="重置" />
<s:submit value="登录" />
</s:form> <h3>Struts 2 表单(支持国际化,只有使用Struts标签才可以支持)</h3>
<s:form namespace="/user" action="login" method="post" >
<s:textfield key="user.login.username.label" name="username" />
<s:password key="user.login.password.label" name="password" />
<s:reset key="user.login.reset.button" />
<s:submit key="user.login.submit.button" />
</s:form> <hr>
<!-- 语言代码小写,国家大写 -->
<a href="${ pageContext.request.contextPath }/user/index?request_locale=zh_CN">中文</a>
<a href="${ pageContext.request.contextPath }/user/index?request_locale=en_US">English</a> </body>
</html>

4、struts.xml文件配置

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 指定属性文件的 baseName 就是 除了 "_语言代码_国家或地区代码.properties" 之外的那部分 -->
<constant name="struts.custom.i18n.resources" value="user_login" /> <package name="user" namespace="/user" extends="struts-default" > <action name="index" >
<result>/i18n/index.jsp</result>
</action> <action name="login" ></action> </package>
</struts>

需要参照default.properites ( org/apache/struts2/default.properties,当需要找常量名称时候打开他)增加常量struts.custom.i18n.resources,指定属性文件的 baseName 就是 除了 "_语言代码_国家或地区代码.properties" 之外的那部分

参考博客链接

https://www.cnblogs.com/hellokitty1/p/5083663.html

https://blog.csdn.net/weixin_36380516/article/details/72510292

转载请于明显处标明出处

https://www.cnblogs.com/AmyZheng/p/9230708.html

Struts2学习(七)的更多相关文章

  1. Struts2学习七----------Struts2后缀

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2后缀 - Struts2默认后缀是action - Struts2使用默认后缀时*.action和*都是同一个请求 - Struts2自 ...

  2. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

  5. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  6. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  7. MyBatis学习七:spring和MyBatis整合

    <\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...

  8. Struts2学习:interceptor(拦截器)的使用

    对于需要登陆验证.权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护.struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组 ...

  9. SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  10. day 85 Vue学习七之vue-cookie

      Vue学习七之vue-cookie   通过vue如何操作cookie呢 参考链接:https://www.jianshu.com/p/535b53989b39 第一步:安装vue-cookies ...

随机推荐

  1. 网络技能大赛A卷测试

    这个测试对我来言有些难度,短时间内做不了太多.首先是思路的理清,登录后的界面有好几种,而且公文的状态也有好几种.理清思路就花了一些时间 然后大致的框架做了做,然后将用户的增删改查还有公文的增删改查写了 ...

  2. 【C语言】将两个字符串连接起来

    #include<stdio.h> int main() { ] = "I "; ] = "am a student"; int i, j, n; ...

  3. C#中发ref和out

    ref--Reference  引用 out--Output   输出 相同点: 代入参数时,前面必须加上ref  out 关键字 都能在方法内对外部的变量的值进行更改 不同点: ref代入的参数必须 ...

  4. 每天进步一点点------altium designer 实用的快捷键

    1.设计浏览器快捷键: 鼠标左击                         选择鼠标位置的文档鼠标双击                         编辑鼠标位置的文档鼠标右击        ...

  5. logging basic

    logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等. 相比print,具备如下优点:        可以通过设置不同的日志等级, ...

  6. .NET平台性能测试工具BenchmarkDotnet 简介[译文]

    项目中需要用到性能测试,发现.net 平台的这个神器. 觉得很不错,接下来准备做个系列.具体参考官方介绍 做基线对比测试不是那么容易,你很容易就翻车掉坑里,BenchmarkDotNet 会帮你避坑( ...

  7. watch监听变化

    <template> <div> 父级 <childCom1 @click.native="fn()"></childCom1> { ...

  8. netty笔记-:Channel与ChannelHandlerContext执行write方法的区别

      在netty中有我们一般有两种发送数据的方式,即使用ChannelHandlerContext或者Channel的write方法,这两种方法都能发送数据,那么其有什么区别呢.这儿引用netty文档 ...

  9. HashMap遍历,取出key和value

    HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,在用keySet(key)取value时候,需要key 第一种: Map map = new HashMap( ...

  10. 外置ADC

    美信关于如何简化微控制器与温度传感器的接口设计?: 一般外置ADC与单片机UC之间通过SPI或SMBUS接口通信 当IO口比较紧张时可以选择脉冲或频率方波正比与测量值输出的外置ADC,此时也可以实现光 ...