Java之struts2框架学习
Java之struts2框架学习
About Struts2
Struts也是一款MVC框架 , Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新的Struts2框架
其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心
Struts2=Struts1+WebWork,而WebWork的核心就是XWork。
XWork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL—the Object Navigation Language),IOC(Inversion of Control 反转控制)容器等。
Struts2 路由配置方式
1、StrutsPrepareAndExecuteFilter
第一种是通过StrutsPrepareAndExecuteFilter
,它是Struts2的核心控制器,也是一个Filter,配置/*
会拦截所有请求,通过之后转发给Struts2框架做请求处理
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
而这样就是全局都是走struts2的路由了
2、ActionServlet
还有一种配置如下,通过ActionServlet
并配置*.do
后缀来匹配请求,将.do
的请求交给ActionServlet
做处理,最终交给Struts2框架
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml
...
</param-value>
</init-param>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
</servlet>
这样操作,就可以自定义一些servlet,从而不走struts2框架进行处理,同时也可以融入SpringMVC,审计时也会遇到SpringMVC+Struts2两个MVC框架做路由的处理。application的配置是说明你的资源包的名字是ApplicationResources.properties,这个一般有关于struts-config.xml
文件中的message-resources
标签
struts-config.xml
<struts-config>
是struts的根元素,它主要有8个子元素,DTD定义如下:
<!ELEMENT struts-config
(data-sources?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)
>
data-sources
Data-sources元素用来配置应用程序所需要的数据源。java语言提供了javax.sql.DateSource接口,所有数据源必须实现该接口。如下配置:
<data-sources>
<data-source type="org.apached.commons.dbcp.BasicDataSource">
………………
</data-source>
</data-sources>
在action中访问方式如下: ataSource = getDataSource(request,"a");
javax.sql.DataSource dataSource;
java.sql.Connection myConnection;
try
{
dataSource = getDataSource(request);
myConnection = dataSource.getConnection();
}
form-beans
该元素主要用来配置表单验证的类。它包含如下属性:
1. classname:一般用得少,指定和form-bean无素对应的配置类,默认为org.apache.struts.config.FormBeanConfig,如果自定义,则必须扩展FormBeanConfig类。可有可无。
2. name:ActionForm Bean的惟一标识。必须。
3. type:ActionForm的完整类名。必须。
<form-beans>
<form-bean
name="Loign"
type="com.ForumActionForm">
</form-bean>
</form-beans>
像是表单名称与type指定的类进行一个绑定,一般type指定的类会继承ActionForm
类,ActionForm
是struts2中的核心组件之一,用来处理表单数据,本质是一个javabean。
其中自带validate()
方法和reset()
方法是 ActionForm中两种可以覆盖的方法。validate()
方法中定义具体的 ActionForm验证规则。reset()
方法则是在初始化时被调用。
action-mappings
描述从特定的请求路径到相应的Action类的映射。该元素用于将Action元素定义到ActionServlet类中,它含有0到多个<action/>
元素
其格式如下:
<action-mappings>
<action path="Action请求的相对路径,与页面<html:form>的Action属性值一致" type="该Action的对应类的全路径" name="该Action绑定的FormBean,与<form-bean >的Name属性值一致"
<forward name="与Action类中mapping.findForward("mapname")返回的mapname值一致" path="页面跳转的相对路径"/>
</action>
</action-mappings>
每个action子元素可包含一个或多个forward子元素。除了path、type和name属性外,action还具有如下属性:
scope:指定ActionForm Bean的作用域(session和request),缺省为session。(可选);
input:当Bean发生错误时返回的路径,在validate验证框架中错误显示的页面(可选);
classname:指定一个调用这个Action类的ActionMapping类的全名。缺省用org.apache.struts.action.ActionMapping(可选);
include:如果没有forward的时候,它起forward的作用(可选);
validate:若为true,则会调用ActionForm的validate()方法或调用validate验证,否则不调用,缺省为true(可选)。
forward属性也是可选的。
例如
<action path="/LoginAction" type="com.action.LoginAction" validate="true">
<forward name="a" path="/a/a.jsp"/>
<forward name="b" path="/b/b.jsp"/>
<forward name="v" path="/c/c.jsp"/>
</action>
首先当我们访问/LoginAction.do
时会找到对应的com.action.LoginAction#execute()
方法做逻辑处理,一般其中以action
来做为具体功能的名称来指定forward路由和功能逻辑,比如访问/LoginAction.do?action=a
就会进入LoginAction#execute()
方法做处理,一般会有if等逻辑,比如判断当action=a
时在处理完当前逻辑后,最终会return mapping.findForward("list");
会转发到在struts-config.xml
中forward
下配置的路由也就是path="/a/a.jsp"
。
global-forwards
该元素主要用来声明全局的转发关系,它具有以下四个属性:
1. className:和forward元素对应的配置类,默认为:org.apache.struts.action.ActionForward。可有可无。
2. contextRelative:此项为true时,表时path属性以"/"开头,相对于当前上下文的URL,默认为false.可有可无。
3. name:转发路径的逻辑名.必填。
4. path:转发或重定向的URL,当contextRelative=false时,URL路径相对于当前应用(application),当为ture时,表示URL路径相对于当前上下文(context)。
5. redirect:当此项为ture时,表示执行重定向操作。当此项为false时表示转向操作。默认为false。
<global-forwards>
<forward name="forms1" path="/a.do"/>
<forward name="forms2" path="/nb.jsp"/>
<global-forwards>
和action-mappings的区别是,global是全局转发
message-resources元素
主要配置本地化消息文本,它具有以下属性。
1. className:和message-resources元素对应的配置类,默认为org.apache.struts.config.MessageResourcesConfig。
2. factory:指定消息资源的工厂类,默认为:org.apache.struts.util.PropertyMessageResourcesFactory类
3. key:指定Resource Bundle存放的ServletContext对象中时采用的属性Key,默认由Globals.MESSAGES_KEY定义的字符串常量,只允许一个Resource Bundle采用默认的属性Key。
4. null:指定MessageSources类如何处理未知消息的key,如果为true,则返回空字符串,如果为false,则返回相关字串,默认为false
5. prameter:指定MessageSources的资源文件名,如果为:a.b.ApplicationResources,则实际对应的文件路径为:WEB-INF/classes/a/b/ApplicationResources.properties.
<message-resources null="false" parameter="defaultResource"/>
<message-resources key="num1" null="false" parameter="test"/>
访问为:
<bean:message key="zxj"/>
<bean:message key="zxj" bundle="num1"/>
Action
一个Action业务里可以实现Action接口,也可以继承ActionSupport类。在ActionSupport中提供了一些实现好的业务方法。在以后的编程中,建议全部继承ActionSupport类。
Action中的方法必须返回一个String类型的字符串,这个字符串与struts.xml中result标签的name属性相对应,struts.xml会根据返回的字符串查找对应的页面。
Action中execute方法必须返回一个String类型字符串,用于后续与struts.xml配置中的result标签的name属性对应完成对应的页面返回
默认提供了5个常用的结果常量 String SUCCESS = "success"; String NONE = "none"; String ERROR = "error"; String INPUT = "input"; String LOGIN = "login";
import com.opensymphony.xwork2.Action;
public class HelloWorldAction implements Action{
//请求中传递的参数和返回给页面的值都定义成属性
private String username;
private String message;
//getter/setter方法
@0verride
public String execute()throws Exception{
//查看请求中传递的参数
System.out.println(username);
//改变这个message,会自动传递给页面
message="hello:"+username;
//SUCCESS是Action中的常量,值是success
return SUCCESS;
}
下面来看下在StrutsPrepareAndExecuteFilter
下如何配置路由,假如有如下action类
package action;
import com.opensymphony.xwork2.Action;
public class HelloWorldAction implements Action{
//请求中传递的参数和返回给页面的值都定义成属性
private String username
private String password
//getter/setter方法
@Override
public String execute() throws Exception{
//查看请求中传递的参数
System.out.print1n(username);
//改变这个message,会自动传递给页面
message="hello:"+username;
//SUCCESS是Action中的常量,值是success
return SUCCESS;
}}
Struts.xml
这种配置方式一般会存在一个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都放在package中,必须继承struts-default-->
<!--struts-default中有默认的拦截器配置,能处理参数等信息-->
<package name="default" extends="struts-default">
<!--name对应的是请求的地址,class是处理请求的类-->
<action name="hello" class="action.HelloWorldAction">
<!--success是Action类中返回的字符串,根据不同字符串返回不同的页面-->
<result name="success">index.jsp</result>
</action>
</package>
</struts>
而比如在login.jsp中有如下表单,当在登陆时提交表单,action触发的事件会将请求交给HelloWorldAction#execute()
处理,而如果登陆验证成功,返回success就会根据struts.xml的配置会返回index.jsp
<form action="hello" method="post">
id:<input name="user.id">
username:<input name="user.username">
<input type="submit" value="提交">
</form>
关于后缀,struts2默认支持.action
后缀,需要配置其他后缀则需要在struts.xml进行如下配置
<constant name="struts.action.extension" value="do, html"/>
同时在struts.xml可以配置默认action,当找不到对应的action时则匹配默认action
对当前的package有效。
action标签的clas省略将调用ActionSupport类。result的name省略将默认为success。
注意default-action-re必须在所有的action标签上面。
<default-action-ref name="default"/>
<action name="default">
<result>error.jsp</result>
</action>
constant标签
constant用来配置常量。name属性是常量名,value属性是常量值。
<!--设置请求后缀-->
<constant name="struts.action.extension"value="do,html"/>
<!--设置编码,解决中文乱码-->
<constant name="struts.i18n.encoding"value="utf-8"/>
<!--设置struts标签主题-->
<constant name="struts.ui.theme"value="simple"/>
package标签
package是包。Struts2的package与java中的package类似,可以把同一个业务模块的action和result集中到一个包中,方便管理。不同的是Struts2的包可以继承。通常都会继承struts-default。在struts-default中定义了大量的struts特性,如拦截器和参数处理的功能,如果不继承struts-default,会遇到参数无法绑定或找不到action类。
name属性是包的名字,一个struts.xml中可以有很多个package,通过name属性进行区分。
namespace是命名空间,/代表的是根目录。namespace的作用类似于SpringMVC中在Controller类上加@RequestMapping注解。相当于此包中所有的action前都加一个父路径。
比如下面第一行配置了跟路径是/
而后续访问action就是/login.cation
<package name="default" namespace="/" extends="struts-default">
<action name="login"class="action.LoginAction">
action标签
action标签用来处理请求和响应结果。
name属性是请求的名字,此处不需要加.action。同一个package下的action不能重名。
class属性指定处理该请求的类,是类的全路径。默认的处理请求时会去类中找名为execute的方法。如果不指定class,将默认ActionSupport为处理请求的类。
result标签用来处理请求结果,name属性是Action类中返回的字符串。标签的值是要跳转的页面地址。name如果不写的话,默认是success。
<action name="1ogin"class="action.LoginAction">
<--success是Action类中返回的字符串,根据不同字符串返回不同的页面-->
<result name="success">index.jsp</result>
<result name="error">error.jsp</result><result name="input">1ogin.jsp</result>
</action>
Action配置自定义业务
Action默认以execute为入口方法处理,当然也可以通过struts.xml修改配置来达到不用execute方法
package action;import com.opensymphony.xwork2.ActionSupport;
/∥继承ActionSupport类
public class UserAction extends ActionSupport{
//处理登录
public String 1ogin(){
//参数和业务略
System.out.println("我是登录");
return SUCCESS;
//处理注册
public String regist(){
//参数和业务略
System.out.println("我是注册");
return SUCCESS;
}
Struts.xml配置,method="login"表示要调用类中的login方法处理请求。如果找不到login0方法,Struts2会在类中查找doLogin)方法。如果都找不到,将会报错。
<package name="user"namespace="/user"extends="struts-
default">
<!--通过method指定调用类中的哪个方法-->
<action name="login"class="action.UserAction"
method="1ogin">
<result name="success">index.jsp</result><!--登录成功去首页-->
<result name="error">1ogin.jsp</result><!--登录失败回登录页-->
</action>
<action name="reg"class="action.UserAction"
method="regist">
<result name="success">index.jsp</result><!--注册成功去首页-->
<result name="error">regist.jsp</result><!--注册失败回登录页-->
</action>
</package>
Action动态方法与通配符
如果一个类中有多个业务方法,又不想给每个业务方法都配置一个action标签,可以使用动态党法调用,
语法:请求名!方法名.action
当请求的格式是user!login.action
时,代表调用UserAction中的login方法处理当前请求。
<!--允许调用动态方法-->
<constant name="struts.enable.DynamicMethodInvocation"
value="true"/>
action配置
<!--允许动态调用的方法,新版里新增的设置-->
<g1obal-a1lowed-methods>1ogin,regist</g1obal-a1lowed-methods>
<action name="user"class="action.UserAction">
<result name="success">/index.jsp</result><!--成功去首页-->
<result name="error">/error.jsp</result><!--失败去错误-->
</action>
通配符
<!--设置useraction中允许通配符匹配的方法-->
<global-allowed-methods>login,regist</global-allowed-methods>
<!--method属性中匹配方法名-->
<action name="*User" class="action.UserAction" method="{1}">
<result name="success">/index.jsp</result>
<result name="error">{1}.jsp</result><!--失败了就返回原来的页面-->
</action>
User匹配所有以User结尾的请求,method={1}中的{1}匹配的就是 User中的。如果请求的地址是loginUser.action,那么{1}匹配的就是login,就会去类中调用login方法,并返回相应的结果。
Result
类型有dispatcher、redirect、redirectAction、chain
dispatcher
result的默认类型就是dispatcher。就是转发,在result
标签的type
属性中设置
<result name="success"type="dispatcher">index.jsp</result>
<result name="success">index.jsp</result>
redirect
redirect是重定向,重定向之后,当前请求中的参数和属性在下一个页面或请求中将不能使用。
<result name="success"type="redirect">index.jsp</result>
redirectAction
redirectAction与redirect类似,不过redirectAction是重定向到某一个action
<action name="reg"class="action.UserAction"method="regist">
<result name="success"
type="redirectAction">1ogin.action</result>
<result name="error">regist.jsp</result>
</action>
如果要调用不同package下的action,需要在result中传参数:
<action name="login"class="action.UserAction"method="login">
<result name="success"type="redirectAction">
<!--调用不同package下的action-->
<param name="namespace">/</param>
<param name="actionName">hel1o.action</param>
<!--传递其它参数-->
<param name="username">123</param>
</result>
<result name="error">login.jsp</result>
</action>
chain
chain类型可以共享当前request
<action name="reg"class="action.UserAction"method="regist">
<!--注意chain的action后面没有后缀-->
<result name="success"type="chain">login</result>
<result name="error">regist.jsp</result>
</action>
动态获取返回结果
private String username;private String page;
//getter/setter方法略
public String 1ogin(){
//参数和业务略
System.out.print1n("我是登录")
if("admin".equals(username))
{
//管理员去管理页
page="admin-page";
}else{//其他人去用户页
page="user-page";
return SUCCESS;
}
result配置
<action name="login"class="action.UserAction"method="1ogin">
<!--读取action中的属性值,返回不同页面-->
<result name="success">${page}.jsp</result>
<result name="error">login.jsp</result>
</action>
validate方法
ActionSupport,ActionSupport中有一个validate方法可以进行校验操作,只需要重写该方法即可实现校验功能。
public class ValidateAction extends ActionSupport {
private String username;//用户名不能为空,并且长度要大于6
@Override
public void validate() {
System.out.println("validate()");
if (username == null || username.trim().length() < 6) {
addFieldError("username", "必须输入用户名,长度大于6");
}
}
}
addFieldError要求必须给result配置一个input类型的结果。所以在调用logout方法时,会报找不到result input。
<action name="valLogin" class="action.ValidateAction" method="login">
<result name="success">main.jsp</result>
<result name="input">val.jsp</result>
</action>
validate方法会验证当前Action类中所有的方法,如果只想验证其中的一个方法,可以使用validatexxx方法,其中xxx是被验证的方法名,首字母大写。
//只验证1ogin方法,不验证其它方法
public void validatelogin(){
if(username==nul1 ll username.1ength()==0){
//向页面中添加错误信息
addFieldError("username",“用户名不能为空”);
对某一个Action类进行校验会用到验证框架
验证框架是把验证信息都写在xm文件中,对某一个Action类进行验证,需要在Action类的同一个包下创建xml文件,文件命名为Action类的类名validation.xml
validators标签:在校验框架中,所有的验证都写在validators标签中field标签:每一个需要验证的属性都是一个field标签,name指定要验证那个属性。
field-validator标签:代表一种验证规则,通过type指定规则。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>必须输入用户名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<message>长度必须大于${minLength}</message>
</field-validator>
</field>
</validators>
interceptor拦截器
类似于filter在请求进入action前作预处理
自定义拦截器类需要实现Interceptor接口或者继承AbstractIntercepter,拦截逻辑主要在intercept方法中,该方法返回一个字符串作为逻辑视图,系统根据返回的字符串跳转到对应的视图资源。每拦截一个动作请求,该方法就会被调用一次。
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class TimeInterceptor implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
//前处理
System.out.println("MyInterceptor3 的前处理!");
//放行
String result = invocation.invoke();
//后处理
System.out.println("MyInterceptor3 的后处理!");
return result;
}
在struts.xml中配置拦截器
<package name="test" namespace="/" extends="struts-default,json-default">
<interceptors>
定义拦截器
<interceptor name="time" class="interceptor.TimeInterceptor"/>
<interceptor name="login" class="interceptor.LoginInterceptor"/>
定义拦截器栈
将多个拦截器绑定到一起,只需要引用拦截器栈即可。
<interceptor-stack name="time-stack">
<interceptor-ref name="time"/>
<interceptor-ref name="login"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
给action添加拦截器饮用
<action name="hello"class="action.HelloWorldAction">
<interceptor-ref name="time"/>
<result name="success">index.jsp</result>
</action>
使用自定义拦截器会造成参数无法读取,这时候可以引入struts自带的拦截器。
<default-interceptor-ref name="time"/>
Reference
https://www.cnblogs.com/nice0e3/p/14800343.html
https://blog.csdn.net/cold___play/article/details/102651720
Java之struts2框架学习的更多相关文章
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Struts2框架学习(一)
Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2 ...
- [ SSH框架 ] Struts2框架学习之一
一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...
- [ SSH框架 ] Struts2框架学习之二
一.Struts2访问Servlet的API 前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 Str ...
- [ SSH框架 ] Struts2框架学习之四(自定义拦截器)
一.Struts2的拦截器 1.1 拦截器概述 拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截 ...
- struts2框架学习之第一天
day01 Struts2概述 1 什么是框架 试想一下,人与人之间不同之处多,还是相同之处多呢?当然是相同之处多,不同之处少!人都有头,而且头都在脖子上面! 软件之间也是相同之处多,不同之处少,框架 ...
- struts2框架学习(二)
---恢复内容开始--- 一.搭建步奏 1.新建web项目,进行必备Jar包的拷贝,放到lib目录以便项目的引用. 2.拷贝框架的核心配置文件Struts.xml,放到src目录下,保留一个基本配置即 ...
- Struts2框架学习(一)——Struts2的概念及搭建
一.Struts2的概念 使用优势:1)自动封装参数 2)参数校验 3)结果的处理(转发|重定向) 4)国际化 5)显示等待页面 6)防止表单重复提交 Struts2具有更加先进的架构以及思想 Str ...
随机推荐
- 图片查看器——viewer.js
使用简介 https://github.com/FNNDSC/viewerjs(需要点击遮罩层关闭弹框的复制下面内容) https://www.jianshu.com/p/d98db3815823 v ...
- Mysql数据库基础_复习思维导图
Mysql复习的一个小总结,用xmind写的.(字数没有都不给我发博客) 下面是一些备注 子查询 MySQL子查询称为内部查询,而包含子查询的查询称为外部查询. 子查询可以在使用表达式的任何地方使用, ...
- 用Docker打包Python运行环境
虽然Docker作为部署环境打包镜像的工具,和我的科研并没有直接的关系.但我觉得在项目中运用Docker来打包环境依赖也可以大大提高工作效率,于是准备专门学习一下Docker. 1. Docker基础 ...
- python模块,邮件推送交换机error级别以上log,django前端展示
前情概要 原syslog服务器只收集不推送日志,可以实时展示,服务器在海外内网,办公网做的有分流,到日志服务器的流量送到香港,其余流量国内,疫情期间在家办公,每次连接需要拨海外l2tp,挂着梯子访问国 ...
- docker 安装和错误解决方案
安装 x64 架构 install docker switch mirror docker desktop docker run -d -p 80:80 docker/getting-started ...
- 监控工具:nmon
软件介绍 分析工具 分析 AIX 和 Linux 性能的免费工具, 这个高效的工具可以工作于任何哑屏幕.telnet 会话.甚至拨号线路.另外,它并不会消耗大量的 CPU 周期,通常低于百分之二. ...
- Python汉诺塔求解
1 def hanoi(n,a,b,c): 2 3 if(n>0): 4 5 hanoi(n-1,a,b,c) 6 7 print("Move disc no:%d from pile ...
- 从零搭建react+ts组件库(封装antd)
为什么会有这样一篇文章?因为网上的教程/示例只说了怎么做,没有系统详细的介绍引入这些依赖.为什么要这样配置,甚至有些文章还是错的!迫于技术洁癖,我希望更多的开发小伙伴能够真正的理解一个项目搭建各个方面 ...
- 三面阿里,被Java面试官虐哭!现场还原真实的“被虐”场景
前言 人人都有大厂梦,我也不例外,从大三开始,就一直想进入阿里工作,大毕竟是大厂,想想也没那么容易,不过好在自己学历还过得去,项目经验也有得讲,所以今年也斗胆尝试了一下,直接就投了阿里云计算.简历是过 ...
- Kubernetes client-go 源码分析 - ListWatcher
概述ListWatch 对象的创建GetterListWatchList() & Watch() 概述 源码版本信息 Project: kubernetes Branch: master La ...